diff --git a/library/Success/Impure.hs b/library/Success/Impure.hs
--- a/library/Success/Impure.hs
+++ b/library/Success/Impure.hs
@@ -1,3 +1,4 @@
+{-# LANGUAGE UndecidableInstances #-}
 -- |
 -- The types and functions are trivial and self-descriptive,
 -- hence this sentence is the sole documentation you get on them.
@@ -12,6 +13,11 @@
 import Prelude
 import Control.Applicative
 import Control.Monad
+import Control.Monad.IO.Class
+import Control.Monad.Error.Class
+import Control.Monad.Trans.Class
+import Control.Monad.Trans.Control
+import Control.Monad.Base
 import qualified Success.Pure
 
 
@@ -56,6 +62,52 @@
   {-# INLINE mplus #-}
   mplus =
     (<|>)
+
+instance (Applicative m, Monad m) => MonadError (Maybe a) (Success a m) where
+  {-# INLINE throwError #-}
+  throwError =
+    Success . return . throwError
+  {-# INLINE catchError #-}
+  catchError (Success m) handler =
+    Success $ m >>= either (unwrap . handler) (return . Success.Pure.success) . Success.Pure.asEither
+    where
+      unwrap (Success m) =
+        m
+
+instance MonadTrans (Success a) where
+  {-# INLINE lift #-}
+  lift =
+    Success . liftM pure
+
+instance (Applicative m, MonadIO m) => MonadIO (Success a m) where
+  {-# INLINE liftIO #-}
+  liftIO =
+    lift . liftIO
+
+instance (Applicative m, MonadBase n m) => MonadBase n (Success a m) where
+  {-# INLINE liftBase #-}
+  liftBase =
+    lift . liftBase
+
+instance MonadTransControl (Success a) where
+  type StT (Success a) b =
+    Success.Pure.Success a b
+  {-# INLINE liftWith #-}
+  liftWith onUnlift =
+    lift $ onUnlift $ \(Success impl) -> impl
+  {-# INLINE restoreT #-}
+  restoreT =
+    Success
+
+instance (Applicative m, MonadBaseControl n m) => MonadBaseControl n (Success a m) where
+  type StM (Success a m) b =
+    ComposeSt (Success a) m b
+  {-# INLINE liftBaseWith #-}
+  liftBaseWith =
+    defaultLiftBaseWith
+  {-# INLINE restoreM #-}
+  restoreM =
+    defaultRestoreM
 
 {-# INLINE run #-}
 run :: Success e m a -> m (Success.Pure.Success e a)
diff --git a/library/Success/Pure.hs b/library/Success/Pure.hs
--- a/library/Success/Pure.hs
+++ b/library/Success/Pure.hs
@@ -17,11 +17,12 @@
 import Prelude
 import Control.Applicative
 import Control.Monad
+import Control.Monad.Error.Class
 
 
 newtype Success a b =
   Success (Either (Maybe a) b)
-  deriving (Functor, Applicative, Monad)
+  deriving (Functor, Applicative, Monad, MonadError (Maybe a), Show)
 
 instance Alternative (Success a) where
   {-# INLINE empty #-}
diff --git a/success.cabal b/success.cabal
--- a/success.cabal
+++ b/success.cabal
@@ -1,7 +1,7 @@
 name:
   success
 version:
-  0.2.1.1
+  0.2.2
 synopsis:
   A version of Either specialised for encoding of success or failure
 description:
@@ -49,5 +49,9 @@
     Success.Pure
     Success.Impure
   build-depends:
+    transformers-base >= 0.4 && < 0.5,
+    monad-control >= 1 && < 2,
+    mtl >= 2 && < 3,
+    transformers >= 0.3 && < 0.5,
     base >= 4.6 && < 5
 
