diff --git a/CHANGELOG.md b/CHANGELOG.md
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -1,3 +1,8 @@
+# v1.4.3.0
+
+* Drop support for GHC 9.4 + 9.6
+* Add support for GHC 9.10 + 9.12
+
 # v1.4.2.1
 
 * Fix benchmarks for GHC 9.8
diff --git a/README.md b/README.md
--- a/README.md
+++ b/README.md
@@ -9,6 +9,8 @@
 `aeson` for decoding nested JSON data that would be cumbersome to represent as
 Haskell ADTs.
 
+Not related to [JSON Schema](https://json-schema.org/).
+
 ## Quickstart
 
 ```haskell
diff --git a/aeson-schemas.cabal b/aeson-schemas.cabal
--- a/aeson-schemas.cabal
+++ b/aeson-schemas.cabal
@@ -1,11 +1,11 @@
 cabal-version: >= 1.10
 
--- This file has been generated from package.yaml by hpack version 0.36.0.
+-- This file has been generated from package.yaml by hpack version 0.37.0.
 --
 -- see: https://github.com/sol/hpack
 
 name:           aeson-schemas
-version:        1.4.2.1
+version:        1.4.3.0
 synopsis:       Easily consume JSON data on-demand with type-safety
 description:    Parse JSON data easily and safely without defining new data types. Useful
                 for deeply nested JSON data, which is difficult to parse using the default
@@ -39,10 +39,9 @@
     test/goldens/getqq_no_operators.golden
     test/goldens/getqq_ops_after_list.golden
     test/goldens/getqq_ops_after_tuple.golden
-    test/goldens/ghc/9.4/getqq_missing_key.golden
-    test/goldens/ghc/9.6/getqq_missing_key.golden
+    test/goldens/ghc/9.10/getqq_missing_key.golden
+    test/goldens/ghc/9.12/getqq_missing_key.golden
     test/goldens/ghc/9.8/getqq_missing_key.golden
-    test/goldens/ghc/9.9/getqq_missing_key.golden
     test/goldens/README_Quickstart.golden
     test/goldens/schemaqq_key_with_invalid_character.golden
     test/goldens/schemaqq_key_with_trailing_escape.golden
@@ -82,9 +81,9 @@
       aeson <3
     , base >=4.17 && <5
     , first-class-families <0.9
-    , hashable <1.5
+    , hashable <1.6
     , megaparsec <10
-    , template-haskell <2.22
+    , template-haskell <2.24
     , text <2.2
     , unordered-containers <0.3
   default-language: Haskell2010
@@ -125,7 +124,6 @@
     , base
     , deepseq
     , filepath
-    , hint
     , interpolate
     , process
     , raw-strings-qq
@@ -139,9 +137,6 @@
     , th-orphans
     , th-test-utils
   default-language: Haskell2010
-  if impl(ghc < 9.2)
-    build-depends:
-        hint <0.9.0.6
 
 benchmark aeson-schemas-bench
   type: exitcode-stdio-1.0
diff --git a/bench/Utils/DeepSeq.hs b/bench/Utils/DeepSeq.hs
--- a/bench/Utils/DeepSeq.hs
+++ b/bench/Utils/DeepSeq.hs
@@ -51,22 +51,14 @@
 instance NFData TypeFamilyHead
 instance NFData TyLit
 instance NFData TySynEqn
-
-#if MIN_VERSION_template_haskell(2,17,0)
 instance NFData Specificity
-#endif
-
-#if MIN_VERSION_template_haskell(2,17,0)
-instance NFData flag => NFData (TyVarBndr flag)
-#else
-instance NFData TyVarBndr
-#endif
-
-#if MIN_VERSION_template_haskell(2,21,0)
+instance (NFData flag) => NFData (TyVarBndr flag)
 instance NFData BndrVis
-#endif
-
 instance NFData Bytes
+
+#if MIN_VERSION_template_haskell(2,22,0)
+instance NFData NamespaceSpecifier
+#endif
 
 instance NFData (ForeignPtr a) where
   rnf = rwhnf
diff --git a/src/Data/Aeson/Schema/TH/Utils.hs b/src/Data/Aeson/Schema/TH/Utils.hs
--- a/src/Data/Aeson/Schema/TH/Utils.hs
+++ b/src/Data/Aeson/Schema/TH/Utils.hs
@@ -1,4 +1,3 @@
-{-# LANGUAGE CPP #-}
 {-# LANGUAGE DataKinds #-}
 {-# LANGUAGE FlexibleContexts #-}
 {-# LANGUAGE LambdaCase #-}
@@ -197,10 +196,8 @@
     AppT ty1 ty2 -> AppT (stripKinds ty1) (stripKinds ty2)
     InfixT ty1 name ty2 -> InfixT (stripKinds ty1) name (stripKinds ty2)
     UInfixT ty1 name ty2 -> UInfixT (stripKinds ty1) name (stripKinds ty2)
-#if MIN_VERSION_template_haskell(2,19,0)
     PromotedInfixT ty1 name ty2 -> PromotedInfixT (stripKinds ty1) name (stripKinds ty2)
     PromotedUInfixT ty1 name ty2 -> PromotedUInfixT (stripKinds ty1) name (stripKinds ty2)
-#endif
     ParensT ty1 -> ParensT (stripKinds ty1)
     ImplicitParamT str ty1 -> ImplicitParamT str (stripKinds ty1)
 
@@ -212,9 +209,7 @@
     UnboxedTupleT _ -> ty
     UnboxedSumT _ -> ty
     ArrowT -> ty
-#if MIN_VERSION_template_haskell(2,17,0)
     MulArrowT -> ty
-#endif
     EqualityT -> ty
     ListT -> ty
     PromotedTupleT _ -> ty
diff --git a/src/Data/Aeson/Schema/Utils/Compat.hs b/src/Data/Aeson/Schema/Utils/Compat.hs
--- a/src/Data/Aeson/Schema/Utils/Compat.hs
+++ b/src/Data/Aeson/Schema/Utils/Compat.hs
@@ -13,7 +13,10 @@
   unions,
 ) where
 
+#if !MIN_VERSION_base(4,20,0)
 import Data.List (foldl')
+#endif
+
 import Data.Text (Text)
 import Prelude hiding (lookup)
 
diff --git a/test/TestUtils.hs b/test/TestUtils.hs
--- a/test/TestUtils.hs
+++ b/test/TestUtils.hs
@@ -22,6 +22,7 @@
   testGoldenIO,
   testParseError,
   ghcGoldenDir,
+  ghcVersion,
 ) where
 
 import Data.Aeson (FromJSON (..), Value, eitherDecode)
@@ -34,6 +35,7 @@
 import qualified Data.Text.Lazy as TextL
 import qualified Data.Text.Lazy.Encoding as TextL
 import Data.Typeable (Typeable, typeRep)
+import Data.Version (Version, makeVersion, showVersion, versionBranch)
 import Language.Haskell.TH (ExpQ)
 import Language.Haskell.TH.Quote (QuasiQuoter (..))
 import System.FilePath ((</>))
@@ -111,11 +113,9 @@
 
 -- | The directory to put GHC version-specific golden files.
 ghcGoldenDir :: FilePath
-ghcGoldenDir = "ghc" </> ghcVersion
+ghcGoldenDir = "ghc" </> showVersion ghcMinorVersion
   where
-    ghcVersion =
-      Text.unpack
-        . Text.intercalate "."
-        . take 2
-        . Text.splitOn "."
-        $ __GLASGOW_HASKELL_FULL_VERSION__
+    ghcMinorVersion = makeVersion . take 2 . versionBranch $ ghcVersion
+
+ghcVersion :: Version
+ghcVersion = makeVersion . map (read . Text.unpack) $ Text.splitOn "." __GLASGOW_HASKELL_FULL_VERSION__
diff --git a/test/TestUtils/DeepSeq.hs b/test/TestUtils/DeepSeq.hs
--- a/test/TestUtils/DeepSeq.hs
+++ b/test/TestUtils/DeepSeq.hs
@@ -51,22 +51,14 @@
 instance NFData TypeFamilyHead
 instance NFData TyLit
 instance NFData TySynEqn
-
-#if MIN_VERSION_template_haskell(2,17,0)
 instance NFData Specificity
-#endif
-
-#if MIN_VERSION_template_haskell(2,17,0)
-instance NFData flag => NFData (TyVarBndr flag)
-#else
-instance NFData TyVarBndr
-#endif
-
-#if MIN_VERSION_template_haskell(2,20,0) && __GLASGOW_HASKELL__ >= 907
+instance (NFData flag) => NFData (TyVarBndr flag)
 instance NFData BndrVis
-#endif
-
 instance NFData Bytes
+
+#if MIN_VERSION_template_haskell(2,22,0)
+instance NFData NamespaceSpecifier
+#endif
 
 instance NFData (ForeignPtr a) where
   rnf = rwhnf
diff --git a/test/Tests/GetQQ.hs b/test/Tests/GetQQ.hs
--- a/test/Tests/GetQQ.hs
+++ b/test/Tests/GetQQ.hs
@@ -1,4 +1,3 @@
-{-# LANGUAGE CPP #-}
 {-# LANGUAGE DataKinds #-}
 {-# LANGUAGE GADTs #-}
 {-# LANGUAGE KindSignatures #-}
@@ -13,13 +12,15 @@
 module Tests.GetQQ where
 
 import Control.DeepSeq (deepseq)
-import Control.Exception (SomeException, displayException, try)
+import Control.Exception (SomeException, try)
 import Data.Aeson (FromJSON (..), ToJSON (..), withText)
 import Data.Aeson.QQ (aesonQQ)
 import Data.Text (Text)
 import qualified Data.Text as Text
-import qualified Language.Haskell.Interpreter as Hint
+import Data.Version (makeVersion)
+import System.Exit (ExitCode (..))
 import System.FilePath ((</>))
+import System.Process (readProcessWithExitCode)
 import Test.Tasty
 import Test.Tasty.HUnit
 import Test.Tasty.QuickCheck
@@ -27,7 +28,7 @@
 import Data.Aeson.Schema (Object, schema)
 import Data.Aeson.Schema.TH (mkEnum)
 import Data.Aeson.Schema.Utils.Sum (SumType (..))
-import TestUtils (ghcGoldenDir, parseObject, testGoldenIO, testParseError)
+import TestUtils (ghcGoldenDir, ghcVersion, parseObject, testGoldenIO, testParseError)
 import Tests.GetQQ.TH
 
 mkEnum "Greeting" ["HELLO", "GOODBYE"]
@@ -401,10 +402,24 @@
     ]
   where
     testDir = "test/wont-compile/"
-    getCompileError fp =
-      Hint.runInterpreter (Hint.loadModules [fp]) >>= \case
-        Left e -> pure $ displayException e
-        Right _ -> error "Compilation unexpectedly succeeded"
+    getCompileError fp = do
+      let args =
+            concat
+              [ [fp]
+              , -- https://gitlab.haskell.org/ghc/ghc/-/issues/25602
+                if ghcVersion < makeVersion [9, 10]
+                  then []
+                  else ["-package", "ghc-internal"]
+              ]
+      (code, stdout, stderr) <- readProcessWithExitCode "ghc" args ""
+      case code of
+        ExitFailure _ -> pure stderr
+        ExitSuccess ->
+          error . unlines $
+            [ "Unexpectedly succeeded:"
+            , stdout
+            , stderr
+            ]
 
 {- Helpers -}
 
diff --git a/test/goldens/ghc/9.10/getqq_missing_key.golden b/test/goldens/ghc/9.10/getqq_missing_key.golden
new file mode 100644
--- /dev/null
+++ b/test/goldens/ghc/9.10/getqq_missing_key.golden
@@ -0,0 +1,50 @@
+test/wont-compile/GetMissingKey.hs:17:15: error: [GHC-64725]
+    • Key 'missing' does not exist in the following schema:
+      '[ '(Data.Aeson.Schema.Key.NormalKey "foo",
+           Data.Aeson.Schema.Type.SchemaScalar Bool)]
+    • In the second argument of ‘(.)’, namely
+        ‘Data.Aeson.Schema.Internal.getKey
+           (GHC.Internal.Data.Proxy.Proxy ::
+              GHC.Internal.Data.Proxy.Proxy "missing")’
+      In the expression:
+        (id
+           . Data.Aeson.Schema.Internal.getKey
+               (GHC.Internal.Data.Proxy.Proxy ::
+                  GHC.Internal.Data.Proxy.Proxy "missing"))
+          o
+      In an equation for ‘result’:
+          result
+            = ((id
+                  . Data.Aeson.Schema.Internal.getKey
+                      (GHC.Internal.Data.Proxy.Proxy ::
+                         GHC.Internal.Data.Proxy.Proxy "missing"))
+                 o)
+   |
+17 | result = [get| o.missing |]
+   |               ^^^^^^^^^^^^^
+
+test/wont-compile/GetMissingKey.hs:17:15: error: [GHC-64725]
+    • Key 'missing' does not exist in the following schema:
+      '[ '(Data.Aeson.Schema.Key.NormalKey "foo",
+           Data.Aeson.Schema.Type.SchemaScalar Bool)]
+    • In the second argument of ‘(.)’, namely
+        ‘Data.Aeson.Schema.Internal.getKey
+           (GHC.Internal.Data.Proxy.Proxy ::
+              GHC.Internal.Data.Proxy.Proxy "missing")’
+      In the expression:
+        (id
+           . Data.Aeson.Schema.Internal.getKey
+               (GHC.Internal.Data.Proxy.Proxy ::
+                  GHC.Internal.Data.Proxy.Proxy "missing"))
+          o
+      In an equation for ‘result’:
+          result
+            = ((id
+                  . Data.Aeson.Schema.Internal.getKey
+                      (GHC.Internal.Data.Proxy.Proxy ::
+                         GHC.Internal.Data.Proxy.Proxy "missing"))
+                 o)
+   |
+17 | result = [get| o.missing |]
+   |               ^^^^^^^^^^^^^
+
diff --git a/test/goldens/ghc/9.12/getqq_missing_key.golden b/test/goldens/ghc/9.12/getqq_missing_key.golden
new file mode 100644
--- /dev/null
+++ b/test/goldens/ghc/9.12/getqq_missing_key.golden
@@ -0,0 +1,50 @@
+test/wont-compile/GetMissingKey.hs:17:15: error: [GHC-64725]
+    • Key 'missing' does not exist in the following schema:
+      '[ '(Data.Aeson.Schema.Key.NormalKey "foo",
+           Data.Aeson.Schema.Type.SchemaScalar Bool)]
+    • In the second argument of ‘(.)’, namely
+        ‘Data.Aeson.Schema.Internal.getKey
+           (GHC.Internal.Data.Proxy.Proxy ::
+              GHC.Internal.Data.Proxy.Proxy "missing")’
+      In the expression:
+        (id
+           . Data.Aeson.Schema.Internal.getKey
+               (GHC.Internal.Data.Proxy.Proxy ::
+                  GHC.Internal.Data.Proxy.Proxy "missing"))
+          o
+      In an equation for ‘result’:
+          result
+            = ((id
+                  . Data.Aeson.Schema.Internal.getKey
+                      (GHC.Internal.Data.Proxy.Proxy ::
+                         GHC.Internal.Data.Proxy.Proxy "missing"))
+                 o)
+   |
+17 | result = [get| o.missing |]
+   |               ^^^^^^^^^^^^^
+
+test/wont-compile/GetMissingKey.hs:17:15: error: [GHC-64725]
+    • Key 'missing' does not exist in the following schema:
+      '[ '(Data.Aeson.Schema.Key.NormalKey "foo",
+           Data.Aeson.Schema.Type.SchemaScalar Bool)]
+    • In the second argument of ‘(.)’, namely
+        ‘Data.Aeson.Schema.Internal.getKey
+           (GHC.Internal.Data.Proxy.Proxy ::
+              GHC.Internal.Data.Proxy.Proxy "missing")’
+      In the expression:
+        (id
+           . Data.Aeson.Schema.Internal.getKey
+               (GHC.Internal.Data.Proxy.Proxy ::
+                  GHC.Internal.Data.Proxy.Proxy "missing"))
+          o
+      In an equation for ‘result’:
+          result
+            = ((id
+                  . Data.Aeson.Schema.Internal.getKey
+                      (GHC.Internal.Data.Proxy.Proxy ::
+                         GHC.Internal.Data.Proxy.Proxy "missing"))
+                 o)
+   |
+17 | result = [get| o.missing |]
+   |               ^^^^^^^^^^^^^
+
diff --git a/test/goldens/ghc/9.4/getqq_missing_key.golden b/test/goldens/ghc/9.4/getqq_missing_key.golden
deleted file mode 100644
--- a/test/goldens/ghc/9.4/getqq_missing_key.golden
+++ /dev/null
@@ -1,18 +0,0 @@
-test/wont-compile/GetMissingKey.hs:17:15: error:
-    • Key 'missing' does not exist in the following schema:
-      '[ '( 'Data.Aeson.Schema.Key.NormalKey "foo",
-            'Data.Aeson.Schema.Type.SchemaScalar Bool)]
-    • In the second argument of ‘(.)’, namely
-        ‘Data.Aeson.Schema.Internal.getKey
-           (Data.Proxy.Proxy :: Data.Proxy.Proxy "missing")’
-      In the expression:
-        (id
-           . Data.Aeson.Schema.Internal.getKey
-               (Data.Proxy.Proxy :: Data.Proxy.Proxy "missing"))
-          o
-      In an equation for ‘result’:
-          result
-            = ((id
-                  . Data.Aeson.Schema.Internal.getKey
-                      (Data.Proxy.Proxy :: Data.Proxy.Proxy "missing"))
-                 o)
diff --git a/test/goldens/ghc/9.6/getqq_missing_key.golden b/test/goldens/ghc/9.6/getqq_missing_key.golden
deleted file mode 100644
--- a/test/goldens/ghc/9.6/getqq_missing_key.golden
+++ /dev/null
@@ -1,18 +0,0 @@
-test/wont-compile/GetMissingKey.hs:17:15: error: [GHC-64725]
-    • Key 'missing' does not exist in the following schema:
-      '[ '(Data.Aeson.Schema.Key.NormalKey "foo",
-           Data.Aeson.Schema.Type.SchemaScalar Bool)]
-    • In the second argument of ‘(.)’, namely
-        ‘Data.Aeson.Schema.Internal.getKey
-           (Data.Proxy.Proxy :: Data.Proxy.Proxy "missing")’
-      In the expression:
-        (id
-           . Data.Aeson.Schema.Internal.getKey
-               (Data.Proxy.Proxy :: Data.Proxy.Proxy "missing"))
-          o
-      In an equation for ‘result’:
-          result
-            = ((id
-                  . Data.Aeson.Schema.Internal.getKey
-                      (Data.Proxy.Proxy :: Data.Proxy.Proxy "missing"))
-                 o)
diff --git a/test/goldens/ghc/9.8/getqq_missing_key.golden b/test/goldens/ghc/9.8/getqq_missing_key.golden
--- a/test/goldens/ghc/9.8/getqq_missing_key.golden
+++ b/test/goldens/ghc/9.8/getqq_missing_key.golden
@@ -1,3 +1,4 @@
+
 test/wont-compile/GetMissingKey.hs:17:15: error: [GHC-64725]
     • Key 'missing' does not exist in the following schema:
       '[ '(Data.Aeson.Schema.Key.NormalKey "foo",
@@ -16,3 +17,28 @@
                   . Data.Aeson.Schema.Internal.getKey
                       (Data.Proxy.Proxy :: Data.Proxy.Proxy "missing"))
                  o)
+   |
+17 | result = [get| o.missing |]
+   |               ^^^^^^^^^^^^^
+
+test/wont-compile/GetMissingKey.hs:17:15: error: [GHC-64725]
+    • Key 'missing' does not exist in the following schema:
+      '[ '(Data.Aeson.Schema.Key.NormalKey "foo",
+           Data.Aeson.Schema.Type.SchemaScalar Bool)]
+    • In the second argument of ‘(.)’, namely
+        ‘Data.Aeson.Schema.Internal.getKey
+           (Data.Proxy.Proxy :: Data.Proxy.Proxy "missing")’
+      In the expression:
+        (id
+           . Data.Aeson.Schema.Internal.getKey
+               (Data.Proxy.Proxy :: Data.Proxy.Proxy "missing"))
+          o
+      In an equation for ‘result’:
+          result
+            = ((id
+                  . Data.Aeson.Schema.Internal.getKey
+                      (Data.Proxy.Proxy :: Data.Proxy.Proxy "missing"))
+                 o)
+   |
+17 | result = [get| o.missing |]
+   |               ^^^^^^^^^^^^^
diff --git a/test/goldens/ghc/9.9/getqq_missing_key.golden b/test/goldens/ghc/9.9/getqq_missing_key.golden
deleted file mode 100644
--- a/test/goldens/ghc/9.9/getqq_missing_key.golden
+++ /dev/null
@@ -1,18 +0,0 @@
-test/wont-compile/GetMissingKey.hs:17:15: error: [GHC-64725]
-    • Key 'missing' does not exist in the following schema:
-      '[ '(Data.Aeson.Schema.Key.NormalKey "foo",
-           Data.Aeson.Schema.Type.SchemaScalar Bool)]
-    • In the second argument of ‘(.)’, namely
-        ‘Data.Aeson.Schema.Internal.getKey
-           (Data.Proxy.Proxy :: Data.Proxy.Proxy "missing")’
-      In the expression:
-        (id
-           . Data.Aeson.Schema.Internal.getKey
-               (Data.Proxy.Proxy :: Data.Proxy.Proxy "missing"))
-          o
-      In an equation for ‘result’:
-          result
-            = ((id
-                  . Data.Aeson.Schema.Internal.getKey
-                      (Data.Proxy.Proxy :: Data.Proxy.Proxy "missing"))
-                 o)
