diff --git a/CHANGELOG.md b/CHANGELOG.md
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -1,3 +1,10 @@
+# 0.6.2 [2023.08.06]
+* The Template Haskell machinery now uses `TemplateHaskellQuotes` when
+  building with GHC 8.0+ instead of manually constructing each Template Haskell
+  `Name`. A consequence of this is that `invariant` will now build with GHC
+  9.8, as `TemplateHaskellQuotes` abstracts over some internal Template Haskell
+  changes introduced in 9.8.
+
 # 0.6.1 [2023.02.27]
 * Support `th-abstraction-0.5.*`.
 
diff --git a/invariant.cabal b/invariant.cabal
--- a/invariant.cabal
+++ b/invariant.cabal
@@ -1,5 +1,5 @@
 name:                invariant
-version:             0.6.1
+version:             0.6.2
 synopsis:            Haskell98 invariant functors
 description:         Haskell98 invariant functors (also known as exponential functors).
                      .
@@ -29,9 +29,9 @@
                    , GHC == 8.8.4
                    , GHC == 8.10.7
                    , GHC == 9.0.2
-                   , GHC == 9.2.6
-                   , GHC == 9.4.4
-                   , GHC == 9.6.1
+                   , GHC == 9.2.7
+                   , GHC == 9.4.5
+                   , GHC == 9.6.2
 extra-source-files:  CHANGELOG.md, README.md
 
 source-repository head
@@ -56,8 +56,8 @@
                      , StateVar             >= 1.1    && < 2
                      , stm                  >= 2.2    && < 3
                      , tagged               >= 0.7.3  && < 1
-                     , template-haskell     >= 2.4    && < 2.21
-                     , th-abstraction       >= 0.4    && < 0.6
+                     , template-haskell     >= 2.4    && < 2.22
+                     , th-abstraction       >= 0.4    && < 0.7
                      , transformers         >= 0.2    && < 0.7
                      , transformers-compat  >= 0.3    && < 1
                      , unordered-containers >= 0.2.4  && < 0.3
diff --git a/src/Data/Functor/Invariant/TH/Internal.hs b/src/Data/Functor/Invariant/TH/Internal.hs
--- a/src/Data/Functor/Invariant/TH/Internal.hs
+++ b/src/Data/Functor/Invariant/TH/Internal.hs
@@ -1,5 +1,9 @@
 {-# LANGUAGE CPP #-}
 
+#if __GLASGOW_HASKELL__ >= 800
+{-# LANGUAGE TemplateHaskellQuotes #-}
+#endif
+
 {-|
 Module:      Data.Functor.Invariant.TH.Internal
 Copyright:   (C) 2012-2017 Nicolas Frisby, (C) 2015-2017 Ryan Scott
@@ -24,9 +28,14 @@
 import           Language.Haskell.TH.Lib
 import           Language.Haskell.TH.Syntax
 
-#ifndef CURRENT_PACKAGE_KEY
+#if __GLASGOW_HASKELL__ >= 800
+import           Data.Coerce (coerce)
+import           Data.Functor.Invariant (Invariant(..), Invariant2(..))
+#else
+# ifndef CURRENT_PACKAGE_KEY
 import           Data.Version (showVersion)
 import           Paths_invariant (version)
+# endif
 #endif
 
 -------------------------------------------------------------------------------
@@ -384,19 +393,52 @@
 #endif
 
 -------------------------------------------------------------------------------
--- Manually quoted names
+-- Quoted names
 -------------------------------------------------------------------------------
 
+#if __GLASGOW_HASKELL__ >= 800
+-- With GHC 8.0 or later, we can simply use TemplateHaskellQuotes to quote each
+-- name. Life is good.
+
+invariantTypeName :: Name
+invariantTypeName = ''Invariant
+
+invariant2TypeName :: Name
+invariant2TypeName = ''Invariant2
+
+invmapValName :: Name
+invmapValName = 'invmap
+
+invmap2ValName :: Name
+invmap2ValName = 'invmap2
+
+invmapConstValName :: Name
+invmapConstValName = 'invmapConst
+
+invmap2ConstValName :: Name
+invmap2ConstValName = 'invmap2Const
+
+coerceValName :: Name
+coerceValName = 'coerce
+
+errorValName :: Name
+errorValName = 'error
+
+seqValName :: Name
+seqValName = 'seq
+#else
+-- On pre-8.0 GHCs, we do not have access to the TemplateHaskellQuotes
+-- extension, so we construct the Template Haskell names by hand.
 -- By manually generating these names we avoid needing to use the
 -- TemplateHaskell language extension when compiling the invariant library.
 -- This allows the library to be used in stage1 cross-compilers.
 
 invariantPackageKey :: String
-#ifdef CURRENT_PACKAGE_KEY
+# ifdef CURRENT_PACKAGE_KEY
 invariantPackageKey = CURRENT_PACKAGE_KEY
-#else
+# else
 invariantPackageKey = "invariant-" ++ showVersion version
-#endif
+# endif
 
 mkInvariantName_tc :: String -> String -> Name
 mkInvariantName_tc = mkNameG_tc invariantPackageKey
@@ -430,3 +472,4 @@
 
 seqValName :: Name
 seqValName = mkNameG_v "ghc-prim" "GHC.Prim" "seq"
+#endif
