diff --git a/src/Language/Haskell/TH/Lift.hs b/src/Language/Haskell/TH/Lift.hs
--- a/src/Language/Haskell/TH/Lift.hs
+++ b/src/Language/Haskell/TH/Lift.hs
@@ -28,9 +28,13 @@
 import GHC.Prim (Char#)
 #endif /* !(MIN_VERSION_template_haskell(2,11,0)) */
 
+import Control.Applicative
 #if MIN_VERSION_template_haskell(2,8,0)
 import Data.Char (ord)
 #endif /* !(MIN_VERSION_template_haskell(2,8,0)) */
+#if MIN_VERSION_base(4,8,0)
+import Data.Functor.Identity
+#endif
 #if !(MIN_VERSION_template_haskell(2,10,0))
 import Data.Ratio (Ratio)
 #endif /* !(MIN_VERSION_template_haskell(2,10,0)) */
@@ -46,19 +50,41 @@
 
 -- | Derive Lift instances for the given datatype.
 deriveLift :: Name -> Q [Dec]
+#if MIN_VERSION_template_haskell(2,9,0)
+deriveLift name = do
+  roles <- qReifyRoles name
+  info <- reify name
+  deriveLift' roles info
+#else
 deriveLift = deriveLift' <=< reify
+#endif
 
 -- | Derive Lift instances for many datatypes.
 deriveLiftMany :: [Name] -> Q [Dec]
+#if MIN_VERSION_template_haskell(2,9,0)
+deriveLiftMany names = do
+  roles <- mapM qReifyRoles names
+  infos <- mapM reify names
+  deriveLiftMany' (zip roles infos)
+#else
 deriveLiftMany = deriveLiftMany' <=< mapM reify
+#endif
 
 -- | Obtain Info values through a custom reification function. This is useful
 -- when generating instances for datatypes that have not yet been declared.
+#if MIN_VERSION_template_haskell(2,9,0)
+deriveLift' :: [Role] -> Info -> Q [Dec]
+deriveLift' roles = fmap (:[]) . deriveLiftOne roles
+
+deriveLiftMany' :: [([Role], Info)] -> Q [Dec]
+deriveLiftMany' = mapM (uncurry deriveLiftOne)
+#else
 deriveLift' :: Info -> Q [Dec]
 deriveLift' = fmap (:[]) . deriveLiftOne
 
 deriveLiftMany' :: [Info] -> Q [Dec]
 deriveLiftMany' = mapM deriveLiftOne
+#endif
 
 -- | Generates a lambda expresson which behaves like 'lift' (without requiring
 -- a 'Lift' instance). Example:
@@ -76,12 +102,17 @@
 makeLift' :: Info -> Q Exp
 makeLift' i = withInfo i $ \_ n _ cons -> makeLiftOne n cons
 
+#if MIN_VERSION_template_haskell(2,9,0)
+deriveLiftOne :: [Role] -> Info -> Q Dec
+deriveLiftOne roles i = withInfo i liftInstance
+#else
 deriveLiftOne :: Info -> Q Dec
 deriveLiftOne i = withInfo i liftInstance
+#endif
   where
     liftInstance dcx n vs cons = do
 #if MIN_VERSION_template_haskell(2,9,0)
-      roles <- qReifyRoles n
+      -- roles <- qReifyRoles n
       -- Compute the set of phantom variables.
       let phvars = catMaybes $
             zipWith (\v role -> if role == PhantomR then Just v else Nothing)
@@ -261,3 +292,11 @@
 instance Integral a => Lift (Ratio a) where
   lift x = return (LitE (RationalL (toRational x)))
 #endif
+
+#if MIN_VERSION_base(4,8,0)
+instance Lift a => Lift (Identity a) where
+  lift = appE (conE 'Identity) . lift . runIdentity
+#endif
+
+instance Lift a => Lift (Const a b) where
+  lift = appE (conE 'Const) . lift . getConst
diff --git a/th-lift.cabal b/th-lift.cabal
--- a/th-lift.cabal
+++ b/th-lift.cabal
@@ -1,5 +1,5 @@
 Name:               th-lift
-Version:            0.7.8
+Version:            0.7.9
 Cabal-Version:      >= 1.8
 License:            BSD3
 License-Files:      COPYING, BSD3, GPL-2
