diff --git a/demo/Main.hs b/demo/Main.hs
deleted file mode 100644
--- a/demo/Main.hs
+++ /dev/null
@@ -1,31 +0,0 @@
-{-# LANGUAGE UndecidableInstances, TypeFamilies, FlexibleInstances,
-             TemplateHaskell, GeneralizedNewtypeDeriving,
-             MultiParamTypeClasses #-}
-module Main where
-
-import Prelude ()
-import BasePrelude
-import NewtypeDeriving
-import Control.Monad.Base
-import Control.Monad.Trans.Control
-import Control.Monad.Trans.Class
-import Control.Monad.Trans.Either
-import Control.Monad.Trans.Maybe
-import Control.Monad.Trans.State
-import Control.Monad.Trans.Reader
-import Control.Monad.Trans.Writer
-
-
-main =
-  return ()
-
-
-newtype T m a =
-  T (ReaderT Int (StateT Char (WriterT [Int] (EitherT String (MaybeT m)))) a)
-  deriving (Functor, Applicative, Monad)
-
-monadTransInstance ''T
-monadTransControlInstance ''T
-monadBaseTransformerInstance ''T
-monadBaseControlTransformerInstance ''T
-
diff --git a/library/NewtypeDeriving/Rendering.hs b/library/NewtypeDeriving/Rendering.hs
--- a/library/NewtypeDeriving/Rendering.hs
+++ b/library/NewtypeDeriving/Rendering.hs
@@ -5,7 +5,7 @@
 import Control.Monad.Trans.Control
 import Control.Monad.Trans.Class
 import NewtypeDeriving.TH
-import Language.Haskell.TH
+import Language.Haskell.TH hiding (classP)
 
 
 monadTransInstance 
@@ -24,17 +24,49 @@
     liftExp =
       foldl' composeExp (ConE conName) $ replicate layersCount (VarE 'lift)
 
+-- |
+-- Produces a declaration in the spirit of the following:
+-- @
+-- instance MonadBase b m => MonadBase b ($(pure transformerT) m) where
+--   liftBase =
+--     $(conE conName) . liftBase
+-- @
 monadBaseTransformerInstance
   :: Type
   -> Name
   -> Dec
-monadBaseTransformerInstance transformerType conName =
-  head $ purifyQ $
-  [d|
-    instance MonadBase b m => MonadBase b ($(pure transformerType) m) where
-      liftBase =
-        $(conE conName) . liftBase
-  |]
+monadBaseTransformerInstance transformerT conName =
+  InstanceD cxt type_ decs
+  where
+    baseMonadName =
+      mkName "b"
+    mainMonadName =
+      mkName "m"
+    baseMonadT =
+      VarT baseMonadName
+    mainMonadT =
+      VarT mainMonadName
+    cxt =
+      [pred]
+      where
+        pred =
+          classP ''MonadBase [baseMonadT, mainMonadT]
+    type_ =
+      foldl1 AppT [ConT ''MonadBase, baseMonadT, AppT transformerT mainMonadT]
+    decs =
+      [liftBaseD]
+      where
+        liftBaseD =
+          FunD 'liftBase [clause]
+          where
+            clause =
+              Clause [] body []
+              where
+                body =
+                  NormalB exp
+                  where
+                    exp =
+                      composeExp (ConE conName) (VarE 'liftBase)
 
 monadTransControlInstance 
   :: Type   -- ^ Type of Newtype
@@ -79,17 +111,72 @@
     stType =
       foldl' (flip AppT) (VarT stArgName) $ map (AppT (ConT ''StT)) layers
 
+-- |
+-- Produces a declaration in the spirit of the following:
+-- @
+-- instance MonadBaseControl b m => MonadBaseControl b ($(pure transformerT) m) where
+--   type StM ($(pure transformerT) m) a = ComposeSt $(pure transformerT) m a
+--   liftBaseWith = defaultLiftBaseWith
+--   restoreM = defaultRestoreM
+-- @
 monadBaseControlTransformerInstance
   :: Type
   -> Dec
-monadBaseControlTransformerInstance t =
-  head $ purifyQ $
-  [d|
-    instance MonadBaseControl b m => MonadBaseControl b ($(pure t) m) where
-      type StM ($(pure t) m) a = ComposeSt $(pure t) m a
-      liftBaseWith = defaultLiftBaseWith
-      restoreM = defaultRestoreM
-  |]
+monadBaseControlTransformerInstance transformerT =
+  InstanceD cxt type_ decs
+  where
+    baseMonadName =
+      mkName "b"
+    mainMonadName =
+      mkName "m"
+    resultName =
+      mkName "a"
+    baseMonadT =
+      VarT baseMonadName
+    mainMonadT =
+      VarT mainMonadName
+    resultT =
+      VarT resultName
+    cxt =
+      [pred]
+      where
+        pred =
+          classP ''MonadBaseControl [baseMonadT, mainMonadT]
+    type_ =
+      AppT (AppT (ConT ''MonadBaseControl) baseMonadT) (AppT transformerT mainMonadT)
+    decs =
+      [stMD, liftBaseWithD, restoreMD]
+      where
+        stMD =
+          TySynInstD ''StM eqn
+          where
+            eqn =
+              TySynEqn [AppT transformerT mainMonadT, resultT] rhsT
+              where
+                rhsT =
+                  foldl1 AppT [ConT ''ComposeSt, transformerT, mainMonadT, resultT]
+        liftBaseWithD =
+          FunD 'liftBaseWith [clause]
+          where
+            clause =
+              Clause [] body []
+              where
+                body =
+                  NormalB exp
+                  where
+                    exp =
+                      VarE 'defaultLiftBaseWith
+        restoreMD =
+          FunD 'restoreM [clause]
+          where
+            clause =
+              Clause [] body []
+              where
+                body =
+                  NormalB exp
+                  where
+                    exp =
+                      VarE 'defaultRestoreM
 
 composeExp :: Exp -> Exp -> Exp
 composeExp a b =
diff --git a/library/NewtypeDeriving/TH.hs b/library/NewtypeDeriving/TH.hs
--- a/library/NewtypeDeriving/TH.hs
+++ b/library/NewtypeDeriving/TH.hs
@@ -1,3 +1,4 @@
+{-# LANGUAGE CPP #-}
 module NewtypeDeriving.TH where
 
 import BasePrelude
@@ -9,3 +10,13 @@
 
 tryToReify :: Name -> Q (Maybe Info)
 tryToReify n = recover (return Nothing) (fmap Just $ reify n) 
+
+{-# INLINE classP #-}
+classP :: Name -> [Type] -> Pred
+#if MIN_VERSION_template_haskell(2,10,0)
+classP n tl =
+  foldl AppT (ConT n) tl
+#else
+classP =
+  ClassP
+#endif
diff --git a/newtype-deriving.cabal b/newtype-deriving.cabal
--- a/newtype-deriving.cabal
+++ b/newtype-deriving.cabal
@@ -1,7 +1,7 @@
 name:
   newtype-deriving
 version:
-  0.1.2
+  0.1.3
 synopsis:
   Instance derivers for newtype wrappers
 description:
@@ -64,33 +64,3 @@
     transformers >= 0.3 && < 0.5,
     base-prelude >= 0.1.3 && < 0.2,
     base >= 4.7 && < 4.9
-
-
--- Well, it's not a benchmark actually, 
--- but in Cabal there's no better way to specify an executable, 
--- which is not intended for distribution.
-benchmark demo
-  type: 
-    exitcode-stdio-1.0
-  hs-source-dirs:
-    demo
-  main-is:
-    Main.hs
-  ghc-options:
-    -O2
-    -threaded
-    "-with-rtsopts=-N"
-    -funbox-strict-fields
-    -ddump-splices
-  default-language:
-    Haskell2010
-  build-depends:
-    newtype-deriving,
-    either,
-    monad-control,
-    transformers-base,
-    transformers,
-    base-prelude,
-    base
-
-
