diff --git a/LICENSE b/LICENSE
--- a/LICENSE
+++ b/LICENSE
@@ -1,4 +1,4 @@
-Copyright (c) 2011, Mikhail Vorozhtsov
+Copyright (c) 2011, Mikhail Vorozhtsov, Bas van Dijk
 All rights reserved.
 
 Redistribution and use in source and binary forms, with or without 
diff --git a/src/Control/Monad/Base.hs b/src/Control/Monad/Base.hs
--- a/src/Control/Monad/Base.hs
+++ b/src/Control/Monad/Base.hs
@@ -1,3 +1,4 @@
+{-# LANGUAGE CPP #-}
 {-# LANGUAGE UnicodeSyntax #-}
 {-# LANGUAGE MultiParamTypeClasses #-}
 {-# LANGUAGE FunctionalDependencies #-}
@@ -5,12 +6,13 @@
 {-# LANGUAGE UndecidableInstances #-}
 
 module Control.Monad.Base (
-    MonadBase(..)
+    MonadBase(..),
+    liftBaseDefault
   ) where
 
 import Data.Monoid
 import Data.Functor.Identity
-import Control.Applicative
+import Control.Applicative (Applicative)
 import qualified Control.Monad.ST.Lazy as L
 import qualified Control.Monad.ST.Strict as S
 import Control.Monad.Trans.Class
@@ -26,42 +28,51 @@
 import qualified Control.Monad.Trans.RWS.Strict as S
 import Control.Monad.Trans.Error
 import Control.Monad.Trans.Cont
+import GHC.Conc.Sync (STM)
 
-class (Applicative μ, Monad μ,
-       Applicative η, Monad η) ⇒ MonadBase η μ | μ → η where
+class (Applicative b, Applicative m, Monad b, Monad m)
+      ⇒ MonadBase b m | m → b where
   -- | Lift a computation from the base monad
-  liftBase ∷ η α → μ α
+  liftBase ∷ b α → m α
 
-instance MonadBase IO IO                 where liftBase = id
-instance MonadBase Identity Identity     where liftBase = id
-instance MonadBase Maybe Maybe           where liftBase = id
-instance MonadBase (Either e) (Either e) where liftBase = id
-instance MonadBase [] []                 where liftBase = id
-instance MonadBase (L.ST s) (L.ST s)     where liftBase = id
-instance MonadBase (S.ST s) (S.ST s)     where liftBase = id
+#define BASE(M) \
+instance MonadBase (M) (M) where liftBase = id
 
-instance MonadBase η μ ⇒ MonadBase η (IdentityT μ) where
-  liftBase = lift . liftBase
-instance MonadBase η μ ⇒ MonadBase η (MaybeT μ) where
-  liftBase = lift . liftBase
-instance MonadBase η μ ⇒ MonadBase η (ListT μ) where
-  liftBase = lift . liftBase
-instance MonadBase η μ ⇒ MonadBase η (ReaderT r μ) where
-  liftBase = lift . liftBase
-instance (Monoid w, MonadBase η μ) ⇒ MonadBase η (L.WriterT w μ) where
-  liftBase = lift . liftBase
-instance (Monoid w, MonadBase η μ) ⇒ MonadBase η (S.WriterT w μ) where
-  liftBase = lift . liftBase
-instance MonadBase η μ ⇒ MonadBase η (L.StateT s μ) where
-  liftBase = lift . liftBase
-instance MonadBase η μ ⇒ MonadBase η (S.StateT s μ) where
-  liftBase = lift . liftBase
-instance (Monoid w, MonadBase η μ) ⇒ MonadBase η (L.RWST r w s μ) where
-  liftBase = lift . liftBase
-instance (Monoid w, MonadBase η μ) ⇒ MonadBase η (S.RWST r w s μ) where
-  liftBase = lift . liftBase
-instance (Error e, MonadBase η μ) ⇒ MonadBase η (ErrorT e μ) where
-  liftBase = lift . liftBase
-instance MonadBase η μ ⇒ MonadBase η (ContT r μ) where
-  liftBase = lift . liftBase
+BASE(IO)
+BASE(L.ST s)
+BASE(S.ST s)
+BASE(STM)
+BASE(Maybe)
+BASE(Either e)
+BASE([])
+BASE((→) r)
+BASE(Identity)
+#undef BASE
 
+-- | Can be used as a default implementation for 'liftBase'.
+--
+-- Note that: @liftBaseDefault = 'lift' . 'liftBase'@
+liftBaseDefault ∷ (MonadTrans t, MonadBase b m) ⇒ b α → t m α
+liftBaseDefault = lift . liftBase
+
+#define TRANS(T) \
+instance (MonadBase b m) ⇒ MonadBase b (T m) where liftBase = liftBaseDefault
+
+TRANS(IdentityT)
+TRANS(MaybeT)
+TRANS(ListT)
+TRANS(ReaderT r)
+TRANS(L.StateT s)
+TRANS(S.StateT s)
+TRANS(ContT r)
+#undef TRANS
+
+#define TRANS_CTX(CTX, T) \
+instance (CTX, MonadBase b m) ⇒ MonadBase b (T m) where liftBase = liftBaseDefault
+
+TRANS_CTX(Monoid w, L.WriterT w)
+TRANS_CTX(Monoid w, S.WriterT w)
+TRANS_CTX(Monoid w, L.RWST r w s)
+TRANS_CTX(Monoid w, S.RWST r w s)
+TRANS_CTX(Error e,  ErrorT e)
+#undef TRANS_CTX
diff --git a/src/Control/Monad/Base/Control.hs b/src/Control/Monad/Base/Control.hs
deleted file mode 100644
--- a/src/Control/Monad/Base/Control.hs
+++ /dev/null
@@ -1,88 +0,0 @@
-{-# LANGUAGE UnicodeSyntax #-}
-{-# LANGUAGE RankNTypes #-}
-{-# LANGUAGE MultiParamTypeClasses #-}
-{-# LANGUAGE FunctionalDependencies #-}
-{-# LANGUAGE FlexibleInstances #-}
-{-# LANGUAGE UndecidableInstances #-}
-
-module Control.Monad.Base.Control (
-    MonadBaseControl(..),
-    controlBase,
-    liftBaseOp,
-    liftBaseOp_
-  ) where
-
-import Data.Monoid
-import Control.Monad
-import Control.Monad.Base
-import Control.Monad.Trans.Identity
-import Control.Monad.Trans.Maybe
-import Control.Monad.Trans.Error
-import Control.Monad.Trans.List
-import Control.Monad.Trans.Reader
-import qualified Control.Monad.Trans.Writer.Lazy as L
-import qualified Control.Monad.Trans.Writer.Strict as S
-import qualified Control.Monad.Trans.State.Lazy as L
-import qualified Control.Monad.Trans.State.Strict as S
-import qualified Control.Monad.Trans.RWS.Lazy as L
-import qualified Control.Monad.Trans.RWS.Strict as S
-import Control.Monad.Trans.Control
-
-class MonadBase η μ ⇒ MonadBaseControl η μ | μ → η where
-  -- | Helper for lifting control operations from the base monad.
-  liftBaseControl ∷ (RunInBase μ η → η α) → μ α
-
-instance MonadBaseControl IO IO where
-  liftBaseControl = idLiftControl
-
-instance MonadBaseControl η μ ⇒ MonadBaseControl η (IdentityT μ) where
-  liftBaseControl = liftLiftControlBase liftBaseControl
-
-instance MonadBaseControl η μ ⇒ MonadBaseControl η (MaybeT μ) where
-  liftBaseControl = liftLiftControlBase liftBaseControl
-
-instance (Error e, MonadBaseControl η μ)
-       ⇒ MonadBaseControl η (ErrorT e μ) where
-  liftBaseControl = liftLiftControlBase liftBaseControl
-
-instance MonadBaseControl η μ ⇒ MonadBaseControl η (ListT μ) where
-  liftBaseControl = liftLiftControlBase liftBaseControl
-
-instance MonadBaseControl η μ ⇒ MonadBaseControl η (ReaderT r μ) where
-  liftBaseControl = liftLiftControlBase liftBaseControl
-
-instance (Monoid w, MonadBaseControl η μ)
-       ⇒ MonadBaseControl η (L.WriterT w μ) where
-  liftBaseControl = liftLiftControlBase liftBaseControl
-
-instance (Monoid w, MonadBaseControl η μ)
-       ⇒ MonadBaseControl η (S.WriterT w μ) where
-  liftBaseControl = liftLiftControlBase liftBaseControl
-
-instance MonadBaseControl η μ ⇒ MonadBaseControl η (L.StateT s μ) where
-  liftBaseControl = liftLiftControlBase liftBaseControl
-
-instance MonadBaseControl η μ ⇒ MonadBaseControl η (S.StateT s μ) where
-  liftBaseControl = liftLiftControlBase liftBaseControl
-
-instance (Monoid w, MonadBaseControl η μ)
-       ⇒ MonadBaseControl η (L.RWST r w s μ) where
-  liftBaseControl = liftLiftControlBase liftBaseControl
-
-instance (Monoid w, MonadBaseControl η μ)
-       ⇒ MonadBaseControl η (S.RWST r w s μ) where
-  liftBaseControl = liftLiftControlBase liftBaseControl
-
-controlBase ∷ MonadBaseControl η μ ⇒ (RunInBase μ η → η (μ α)) → μ α
-controlBase = join . liftBaseControl
-
-liftBaseOp ∷ MonadBaseControl η μ
-           ⇒ ((α → η (μ β)) → η (μ γ))
-           →  (α →    μ β ) →    μ γ
-liftBaseOp base m = controlBase $ \runInBase → base $ runInBase . m
-
-liftBaseOp_ ∷ MonadBaseControl η μ
-           ⇒ (η (μ β) → η (μ γ))
-           →     μ β  →    μ γ
-liftBaseOp_ base m = controlBase $ \runInBase → base $ runInBase m
-
diff --git a/transformers-base.cabal b/transformers-base.cabal
--- a/transformers-base.cabal
+++ b/transformers-base.cabal
@@ -1,5 +1,5 @@
 Name: transformers-base
-Version: 0.3
+Version: 0.4
 Category: Control
 Stability: experimental
 Synopsis: Lift computations from the bottom of a transformer stack
@@ -10,9 +10,13 @@
 Homepage: https://github.com/mvv/transformers-base
 Bug-Reports: https://github.com/mvv/transformers-base/issues
 
-Author: Mikhail Vorozhtsov <mikhail.vorozhtsov@gmail.com>
+Author:
+  Mikhail Vorozhtsov <mikhail.vorozhtsov@gmail.com>,
+  Bas van Dijk <v.dijk.bas@gmail.com>
 Maintainer: Mikhail Vorozhtsov <mikhail.vorozhtsov@gmail.com>
-Copyright: 2011 Mikhail Vorozhtsov <mikhail.vorozhtsov@gmail.com>
+Copyright:
+  2011 Mikhail Vorozhtsov <mikhail.vorozhtsov@gmail.com>,
+       Bas van Dijk <v.dijk.bas@gmail.com>
 License: BSD3
 License-File: LICENSE
 
@@ -26,11 +30,8 @@
 Library
   Build-Depends:
     base          >= 4.4 && < 5,
-    transformers  >= 0.2,
-    monad-control >= 0.2.0.2
+    transformers  >= 0.2
   Hs-Source-Dirs: src
   GHC-Options: -Wall
   Exposed-Modules:
     Control.Monad.Base
-    Control.Monad.Base.Control
-
