diff --git a/CHANGELOG.md b/CHANGELOG.md
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -1,3 +1,6 @@
+### 0.1.3 [2019.11.26]
+* Add `genericLiftTyped` and `genericLiftTypedWithPkg`.
+
 ### 0.1.2
 * Add a case for `V1` (i.e., empty data types), which diverges in the way
   you'd expect.
diff --git a/lift-generics.cabal b/lift-generics.cabal
--- a/lift-generics.cabal
+++ b/lift-generics.cabal
@@ -1,5 +1,5 @@
 name:                lift-generics
-version:             0.1.2
+version:             0.1.3
 synopsis:            GHC.Generics-based Language.Haskell.TH.Syntax.lift implementation
 description:         This package provides a "GHC.Generics"-based @genericLiftWithPkg@
                      function (intended for GHC 7.10 and earlier), as well as a
@@ -38,6 +38,10 @@
                    , GHC == 7.10.3
                    , GHC == 8.0.2
                    , GHC == 8.2.2
+                   , GHC == 8.4.4
+                   , GHC == 8.6.5
+                   , GHC == 8.8.1
+                   , GHC == 8.10.1
 extra-source-files:  CHANGELOG.md, README.md
 cabal-version:       >=1.10
 
@@ -50,7 +54,7 @@
   build-depends:       base             >= 4.3 && < 5
                      , generic-deriving >= 1.9 && < 2
                      , ghc-prim
-                     , template-haskell >= 2.4 && < 2.13
+                     , template-haskell >= 2.4 && < 2.17
   hs-source-dirs:      src
   default-language:    Haskell2010
   ghc-options:         -Wall
@@ -66,7 +70,8 @@
                      , generic-deriving >= 1.9   && < 2
                      , hspec            >= 2     && < 3
                      , lift-generics
-                     , template-haskell >= 2.4   && < 2.13
+                     , template-haskell >= 2.4   && < 2.17
+  build-tool-depends:  hspec-discover:hspec-discover
   hs-source-dirs:      tests
   default-language:    Haskell2010
   ghc-options:         -Wall -threaded -rtsopts
diff --git a/src/Language/Haskell/TH/Lift/Generics.hs b/src/Language/Haskell/TH/Lift/Generics.hs
--- a/src/Language/Haskell/TH/Lift/Generics.hs
+++ b/src/Language/Haskell/TH/Lift/Generics.hs
@@ -20,8 +20,12 @@
 -}
 module Language.Haskell.TH.Lift.Generics (
       genericLiftWithPkg
+#if MIN_VERSION_template_haskell(2,9,0)
+    , genericLiftTypedWithPkg
+#endif
 #if __GLASGOW_HASKELL__ >= 711
     , genericLift
+    , genericLiftTyped
 #endif
     , GLift(..)
     , GLiftDatatype(..)
@@ -103,6 +107,12 @@
 genericLiftWithPkg :: (Generic a, GLift (Rep a)) => String -> a -> Q Exp
 genericLiftWithPkg pkg = glift pkg . from
 
+#if MIN_VERSION_template_haskell(2,9,0)
+-- | Like 'genericLiftWithPkg', but returns a 'TExp' instead of an 'Exp'.
+genericLiftTypedWithPkg :: (Generic a, GLift (Rep a)) => String -> a -> Q (TExp a)
+genericLiftTypedWithPkg pkg = unsafeTExpCoerce . genericLiftWithPkg pkg
+#endif
+
 #if __GLASGOW_HASKELL__ >= 711
 -- | "GHC.Generics"-based 'lift' implementation. Only available on GHC 8.0 and later
 -- due to API limitations of earlier GHC versions.
@@ -137,6 +147,10 @@
 -- @
 genericLift :: (Generic a, GLift (Rep a)) => a -> Q Exp
 genericLift = glift "" . from
+
+-- | Like 'genericLift', but returns a 'TExp' instead of an 'Exp'.
+genericLiftTyped :: (Generic a, GLift (Rep a)) => a -> Q (TExp a)
+genericLiftTyped = unsafeTExpCoerce . genericLift
 #endif
 
 -- | Class of generic representation types which can be converted to Template
diff --git a/tests/LiftGenericsSpec.hs b/tests/LiftGenericsSpec.hs
--- a/tests/LiftGenericsSpec.hs
+++ b/tests/LiftGenericsSpec.hs
@@ -1,3 +1,4 @@
+{-# LANGUAGE CPP #-}
 {-# LANGUAGE TemplateHaskell #-}
 
 {-|
@@ -10,7 +11,7 @@
 -}
 module LiftGenericsSpec (main, spec) where
 
-import Language.Haskell.TH.Syntax (lift)
+import Language.Haskell.TH.Syntax (Lift(..))
 import Test.Hspec (Spec, hspec, describe, it, parallel, shouldBe)
 import Types (Unit(..), p, s, u)
 
@@ -35,3 +36,11 @@
     describe "Unboxed" $
         it description $
             u `shouldBe` $(lift u)
+#if MIN_VERSION_template_haskell(2,16,0)
+    describe "genericLiftTyped" $
+        it "should do what you expect" $ do
+            Unit `shouldBe` $$(liftTyped Unit)
+            p    `shouldBe` $$(liftTyped p)
+            s    `shouldBe` $$(liftTyped s)
+            u    `shouldBe` $$(liftTyped u)
+#endif
diff --git a/tests/Types.hs b/tests/Types.hs
--- a/tests/Types.hs
+++ b/tests/Types.hs
@@ -21,7 +21,11 @@
 
 import GHC.Exts
 
-import Language.Haskell.TH.Lift.Generics (genericLiftWithPkg)
+import Language.Haskell.TH.Lift.Generics ( genericLiftWithPkg
+#if MIN_VERSION_template_haskell(2,16,0)
+                                         , genericLiftTyped
+#endif
+                                         )
 import Language.Haskell.TH.Syntax (Lift(..))
 
 import Prelude ()
@@ -29,10 +33,16 @@
 
 data Unit = Unit
   deriving (Eq, Ord, Show)
+$(deriveAll ''Unit)
+
 data Product a b c d = Product a b c d
   deriving (Eq, Ord, Show)
+$(deriveAll ''Product)
+
 data Sum a b = Inl a | Inr b
   deriving (Eq, Ord, Show)
+$(deriveAll ''Sum)
+
 data Unboxed a
    = Unboxed a
 #if MIN_VERSION_template_haskell(2,11,0)
@@ -43,6 +53,7 @@
              Int#
              Word#
   deriving (Eq, Ord, Show)
+$(deriveAll ''Unboxed)
 
 p :: Product Char Int Bool String
 p = Product 'a' 1 True "b"
@@ -65,17 +76,24 @@
 
 instance Lift Unit where
     lift = genericLiftWithPkg pkgKey
+#if MIN_VERSION_template_haskell(2,16,0)
+    liftTyped = genericLiftTyped
+#endif
 
 instance (Lift a, Lift b, Lift c, Lift d) => Lift (Product a b c d) where
     lift = genericLiftWithPkg pkgKey
+#if MIN_VERSION_template_haskell(2,16,0)
+    liftTyped = genericLiftTyped
+#endif
 
 instance (Lift a, Lift b) => Lift (Sum a b) where
     lift = genericLiftWithPkg pkgKey
+#if MIN_VERSION_template_haskell(2,16,0)
+    liftTyped = genericLiftTyped
+#endif
 
 instance Lift a => Lift (Unboxed a) where
     lift = genericLiftWithPkg pkgKey
-
-$(deriveAll ''Unit)
-$(deriveAll ''Product)
-$(deriveAll ''Sum)
-$(deriveAll ''Unboxed)
+#if MIN_VERSION_template_haskell(2,16,0)
+    liftTyped = genericLiftTyped
+#endif
