diff --git a/src/Control/Monad/Trans/Abort.hs b/src/Control/Monad/Trans/Abort.hs
--- a/src/Control/Monad/Trans/Abort.hs
+++ b/src/Control/Monad/Trans/Abort.hs
@@ -6,9 +6,7 @@
 module Control.Monad.Trans.Abort (
     Abort,
     runAbort,
-    runAbort',
     AbortT(..),
-    runAbortT',
     abort,
     recover
   ) where
@@ -23,6 +21,7 @@
 import Control.Applicative
 import Control.Monad (ap, MonadPlus(..))
 import Control.Monad.Base
+import Control.Monad.Base.Control
 import Control.Monad.Fix
 import Control.Monad.Trans.Class
 import Control.Monad.Trans.Control
@@ -94,14 +93,11 @@
 instance MonadControlIO μ ⇒ MonadControlIO (AbortT e μ) where
   liftControlIO = liftLiftControlBase liftControlIO
 
+instance MonadBaseControl μ η ⇒ MonadBaseControl (AbortT e μ) η where
+  liftBaseControl = liftLiftControlBase liftBaseControl
+
 instance Monad μ ⇒ Failure e (AbortT e μ) where
   failure = abort
-
-runAbortT' ∷ Monad μ ⇒ AbortT α μ α → μ α
-runAbortT' m = runAbortT m >>= return . either id id
-
-runAbort' ∷ Abort α α → α
-runAbort' = runIdentity . runAbortT'
 
 abort ∷ Monad μ ⇒ e → AbortT e μ α
 abort = AbortT . return . Left
diff --git a/src/Control/Monad/Trans/Finish.hs b/src/Control/Monad/Trans/Finish.hs
new file mode 100644
--- /dev/null
+++ b/src/Control/Monad/Trans/Finish.hs
@@ -0,0 +1,90 @@
+{-# LANGUAGE UnicodeSyntax #-}
+{-# LANGUAGE MultiParamTypeClasses #-}
+{-# LANGUAGE FlexibleInstances #-}
+{-# LANGUAGE UndecidableInstances #-}
+
+module Control.Monad.Trans.Finish (
+    Finish,
+    runFinish,
+    runFinish',
+    FinishT(..),
+    runFinishT',
+    finish,
+  ) where
+
+import Data.Pointed
+import Data.Functor.Identity
+import Data.Functor.Bind
+import Data.Functor.Bind.Trans
+import Control.Applicative
+import Control.Monad (ap)
+import Control.Monad.Base
+import Control.Monad.Base.Control
+import Control.Monad.Fix
+import Control.Monad.Trans.Class
+import Control.Monad.Trans.Control
+import Control.Monad.IO.Class
+import Control.Monad.IO.Control
+
+newtype FinishT f μ α = FinishT { runFinishT ∷ μ (Either f α) }
+
+type Finish f α = FinishT f Identity α
+
+runFinish ∷ Finish f α → Either f α
+runFinish = runIdentity . runFinishT
+
+instance Monad μ ⇒ Pointed (FinishT f μ) where
+  point = FinishT . return . Right
+
+instance Functor μ ⇒ Functor (FinishT f μ) where
+  fmap f = FinishT . fmap (fmap f) . runFinishT
+
+instance (Functor μ, Monad μ) ⇒ Apply (FinishT f μ) where
+  (<.>) = ap
+
+instance (Functor μ, Monad μ) ⇒ Applicative (FinishT f μ) where
+  pure  = return
+  (<*>) = ap
+
+instance (Functor μ, Monad μ) ⇒ Bind (FinishT f μ) where
+  (>>-) = (>>=)
+
+instance Monad μ ⇒ Monad (FinishT f μ) where
+  return  = FinishT . return . Right
+  m >>= f = FinishT $ runFinishT m >>= either (return . Left) (runFinishT . f)
+  fail    = FinishT . fail
+
+instance MonadFix μ ⇒ MonadFix (FinishT f μ) where
+  mfix f = FinishT $ mfix $
+    runFinishT . f . either (error "mfix(FinishT): Left") id
+
+instance MonadIO μ ⇒ MonadIO (FinishT f μ) where
+  liftIO = lift . liftIO
+
+instance MonadBase μ η ⇒ MonadBase (FinishT f μ) η where
+  liftBase = lift . liftBase
+
+instance BindTrans (FinishT f) where
+  liftB = FinishT . fmap Right
+
+instance MonadTrans (FinishT f) where
+  lift = FinishT . ap (return Right)
+
+instance MonadTransControl (FinishT f) where
+  liftControl f = lift $ f $ (return . FinishT . return =<<) . runFinishT
+
+instance MonadControlIO μ ⇒ MonadControlIO (FinishT f μ) where
+  liftControlIO = liftLiftControlBase liftControlIO
+
+instance MonadBaseControl μ η ⇒ MonadBaseControl (FinishT f μ) η where
+  liftBaseControl = liftLiftControlBase liftBaseControl
+
+runFinishT' ∷ Monad μ ⇒ FinishT α μ α → μ α
+runFinishT' m = runFinishT m >>= return . either id id
+
+runFinish' ∷ Finish α α → α
+runFinish' = runIdentity . runFinishT'
+
+finish ∷ Monad μ ⇒ f → FinishT f μ α
+finish = FinishT . return . Left
+
diff --git a/transformers-abort.cabal b/transformers-abort.cabal
--- a/transformers-abort.cabal
+++ b/transformers-abort.cabal
@@ -1,5 +1,5 @@
 Name: transformers-abort
-Version: 0.1
+Version: 0.2
 Category: Control
 Stability: experimental
 Synopsis: A better error monad transformer
@@ -27,7 +27,7 @@
   Build-Depends:
     base              >= 4 && < 5,
     transformers      >= 0.2,
-    transformers-base >= 0.1,
+    transformers-base >= 0.2,
     semigroupoids     >= 1.2,
     pointed           >= 2.0.1,
     data-default      >= 0.2,
@@ -37,4 +37,5 @@
   GHC-Options: -Wall
   Exposed-Modules:
     Control.Monad.Trans.Abort
+    Control.Monad.Trans.Finish
 
