diff --git a/ChangeLog.md b/ChangeLog.md
--- a/ChangeLog.md
+++ b/ChangeLog.md
@@ -1,3 +1,7 @@
+## 1.0.5 (2021-05-03)
+
+- Add (Template Haskell) `Lift UUID` instance
+
 ## 1.0.4.0
 
 - Declare `Data.UUID.Types` module "`Trustworthy`" with respect to SafeHaskell.
diff --git a/src/Data/UUID/Types/Internal.hs b/src/Data/UUID/Types/Internal.hs
--- a/src/Data/UUID/Types/Internal.hs
+++ b/src/Data/UUID/Types/Internal.hs
@@ -5,6 +5,10 @@
 #if __GLASGOW_HASKELL__ >= 704
 {-# LANGUAGE Unsafe             #-}
 #endif
+#if __GLASGOW_HASKELL__ >=800
+{-# LANGUAGE DeriveLift         #-}
+{-# LANGUAGE StandaloneDeriving #-}
+#endif
 
 {-# OPTIONS_HADDOCK hide #-}
 
@@ -79,6 +83,12 @@
 import           System.Random (Random (..), next)
 #endif
 
+#if __GLASGOW_HASKELL__ >=800
+import Language.Haskell.TH.Syntax (Lift)
+#else
+import Language.Haskell.TH (appE, varE)
+import Language.Haskell.TH.Syntax (Lift (..), mkNameG_v, Lit (IntegerL), Exp (LitE))
+#endif
 
 -- | Type representing <https://en.wikipedia.org/wiki/UUID Universally Unique Identifiers (UUID)> as specified in
 --  <http://tools.ietf.org/html/rfc4122 RFC 4122>.
@@ -618,4 +628,21 @@
 unsafeShiftR = shiftR
 {-# INLINE unsafeShiftL #-}
 unsafeShiftL = shiftL
+#endif
+
+#if __GLASGOW_HASKELL__ >=800
+deriving instance Lift UUID
+#else
+instance Lift UUID where
+    lift (UUID w1 w2) = varE fromWords64Name `appE` liftW64 w1 `appE` liftW64 w2
+      where
+        fromWords64Name = mkNameG_v currentPackageKey "Data.UUID.Types.Internal" "fromWords64"
+        liftW64 x = return (LitE (IntegerL (fromIntegral x)))
+
+currentPackageKey :: String
+#ifdef CURRENT_PACKAGE_KEY
+currentPackageKey = CURRENT_PACKAGE_KEY
+#else
+currentPackageKey = "uuid-types-1.0.5"
+#endif
 #endif
diff --git a/tests/TestUUID.hs b/tests/TestUUID.hs
--- a/tests/TestUUID.hs
+++ b/tests/TestUUID.hs
@@ -1,4 +1,5 @@
 {-# LANGUAGE ViewPatterns #-}
+{-# LANGUAGE TemplateHaskell #-}
 
 {-# OPTIONS_GHC -fno-warn-orphans #-}
 
@@ -40,6 +41,11 @@
     testCase "nil bytes"  $ U.toByteString U.nil @?= BL.pack (replicate 16 0)
     ]
 
+test_lift :: Test
+test_lift = testCase "TH.Lift" $ do
+    let uuid = U.fromWords64 123456789 987654321
+    uuid @?= $( [| uuid |] )
+
 test_conv :: Test
 test_conv = testGroup "conversions" [
     testCase "conv bytes to string" $
@@ -176,6 +182,7 @@
      [ [
         test_null,
         test_nil,
+        test_lift,
         test_conv,
         test_fromByteString,
         test_fromWords,
diff --git a/uuid-types.cabal b/uuid-types.cabal
--- a/uuid-types.cabal
+++ b/uuid-types.cabal
@@ -1,6 +1,6 @@
 cabal-version:      1.12
 name:               uuid-types
-version:            1.0.4
+version:            1.0.5
 copyright:
   (c) 2017-2018 Herbert Valerio Riedel
   (c) 2008-2014 Antoine Latter
@@ -45,13 +45,14 @@
 
 library
   build-depends:
-      base        >=4.5     && <5
-    , binary      >=0.5.1.0 && <0.9
-    , bytestring  >=0.9.2.1 && <0.12
-    , deepseq     >=1.3.0.0 && <1.5
-    , hashable    >=1.2.7.0 && <1.4
-    , random      >=1.1     && <1.3
-    , text        >=1.2.3.0 && <1.3
+      base              >=4.5     && <5
+    , binary            >=0.5.1.0 && <0.9
+    , bytestring        >=0.9.2.1 && <0.12
+    , deepseq           >=1.3.0.0 && <1.5
+    , hashable          >=1.2.7.0 && <1.4
+    , random            >=1.1     && <1.3
+    , template-haskell  >=2.7.0.0 && <2.18
+    , text              >=1.2.3.0 && <1.3
 
   exposed-modules:  Data.UUID.Types
 
@@ -82,6 +83,7 @@
     , binary
     , bytestring
     , uuid-types
+    , template-haskell
 
   -- deps w/o inherited constraints
   build-depends:
