diff --git a/aeson.cabal b/aeson.cabal
--- a/aeson.cabal
+++ b/aeson.cabal
@@ -1,6 +1,6 @@
 cabal-version:      2.2
 name:               aeson
-version:            2.2.4.0
+version:            2.2.4.1
 license:            BSD-3-Clause
 license-file:       LICENSE
 category:           Text, Web, JSON
@@ -21,7 +21,8 @@
    || ==9.6.6
    || ==9.8.4
    || ==9.10.1
-   || ==9.12.1
+   || ==9.12.4
+   || ==9.14.1
 
 synopsis:           Fast JSON parsing and encoding
 homepage:           https://github.com/haskell/aeson
@@ -95,19 +96,20 @@
   build-depends:
     , base              >=4.12.0.0 && <5
     , bytestring        >=0.10.8.2 && <0.13
-    , containers        >=0.6.0.1  && <0.8
+    , containers        >=0.6.0.1  && <0.9
     , deepseq           >=1.4.4.0  && <1.6
     , exceptions        >=0.10.4   && <0.11
-    , ghc-prim          >=0.5.0.0  && <0.14
-    , template-haskell  >=2.14.0.0 && <2.24
+    , template-haskell  >=2.14.0.0 && <2.25
     , text              >=1.2.3.0  && <1.3  || >=2.0 && <2.2
-    , time              >=1.8.0.2  && <1.15
+    , time              >=1.8.0.2  && <1.16
 
   -- Compat
   build-depends:
-    , generically  >=0.1   && <0.2
     , time-compat  >=1.9.6 && <1.10
 
+  if !impl(ghc >=9.4)
+    build-depends: generically >=0.1 && <0.2
+
   if !impl(ghc >=9.0)
     build-depends: integer-gmp
 
@@ -203,20 +205,17 @@
     , bytestring
     , containers
     , data-fix
-    , deepseq
     , Diff                  >=0.4    && <0.6  || ^>=1.0.2
     , directory
     , dlist
     , filepath
     , generic-deriving      >=1.10   && <1.15
     , generically
-    , ghc-prim              >=0.2
     , hashable
     , indexed-traversable
     , integer-logarithms    >=1      && <1.1
     , network-uri
     , OneTuple
-    , primitive
     , QuickCheck
     , quickcheck-instances  >=0.3.29 && <0.5
     , scientific
@@ -226,7 +225,6 @@
     , tasty-golden
     , tasty-hunit
     , tasty-quickcheck
-    , template-haskell
     , text
     , text-short
     , these
diff --git a/src/Data/Aeson/TH.hs b/src/Data/Aeson/TH.hs
--- a/src/Data/Aeson/TH.hs
+++ b/src/Data/Aeson/TH.hs
@@ -945,7 +945,7 @@
                           (appE [|show|] (varE unknownFields)))
                       []
               ]
-      x:xs = [ lookupField argTy
+      (x,xs) = nonEmpty [ lookupField argTy
                `appE` dispatchParseJSON jc conName tvMap argTy
                `appE` litE (stringL $ show tName)
                `appE` litE (stringL $ constructorTagModifier opts $ nameBase conName)
@@ -955,6 +955,11 @@
              | (field, argTy) <- zip fields argTys
              ]
 
+-- A hack, as I'm too lazy to changge code to not assume fields are non empty.
+nonEmpty :: [a] -> (a, [a])
+nonEmpty (x:xs) = (x,xs)
+nonEmpty []     = error "unexpected empty list"
+
 getValField :: Name -> String -> [MatchQ] -> Q Exp
 getValField obj valFieldName matches = do
   val <- newName "val"
@@ -1056,12 +1061,12 @@
              -> [Type] -- ^ The argument types of the constructor.
              -> Name -- ^ Name of the type to which the constructor belongs.
              -> Name -- ^ 'Con'structor name.
-             -> Integer -- ^ 'Con'structor arity.
+             -> Integer -- ^ 'Con'structor arity. >= 1
              -> [Q Match]
 parseProduct jc tvMap argTys tName conName numArgs =
     [ do arr <- newName "arr"
          -- List of: "parseJSON (arr `V.unsafeIndex` <IX>)"
-         let x:xs = [ dispatchParseJSON jc conName tvMap argTy
+         let (x,xs) = nonEmpty [ dispatchParseJSON jc conName tvMap argTy
                       `appE`
                       infixApp (varE arr)
                                [|V.unsafeIndex|]
