diff --git a/rattletrap.cabal b/rattletrap.cabal
--- a/rattletrap.cabal
+++ b/rattletrap.cabal
@@ -1,7 +1,7 @@
 cabal-version: 2.2
 
 name: rattletrap
-version: 12.1.1
+version: 12.1.2
 synopsis: Parse and generate Rocket League replays.
 description: Rattletrap parses and generates Rocket League replays.
 
@@ -22,7 +22,7 @@
   manual: True
 
 common library
-  build-depends: base >= 4.16 && < 4.19
+  build-depends: base >= 4.16 && < 4.20
   default-extensions: NamedFieldPuns
   default-language: Haskell2010
   ghc-options:
@@ -43,6 +43,9 @@
   if flag(pedantic)
     ghc-options: -Werror
 
+  if impl(ghc >= 9.8)
+    ghc-options: -Wno-missing-role-annotations
+
 common executable
   import: library
 
@@ -62,7 +65,7 @@
     , filepath >= 1.4.2 && < 1.5
     , http-client >= 0.7.13 && < 0.8
     , http-client-tls >= 0.3.6 && < 0.4
-    , text >= 1.2.5 && < 1.3 || >= 2.0 && < 2.1
+    , text >= 1.2.5 && < 1.3 || >= 2.0 && < 2.2
   exposed-modules:
     Paths_rattletrap
     Rattletrap
diff --git a/src/lib/Rattletrap/Utility/Json.hs b/src/lib/Rattletrap/Utility/Json.hs
--- a/src/lib/Rattletrap/Utility/Json.hs
+++ b/src/lib/Rattletrap/Utility/Json.hs
@@ -36,9 +36,9 @@
 optional object key = object Aeson..:? Key.fromString key
 
 # if MIN_VERSION_aeson(2, 2, 0)
-pair :: (Aeson.ToJSON value, Aeson.KeyValue e pair) => String -> value -> pair
+pair :: (Aeson.ToJSON value, Aeson.KeyValue e p) => String -> value -> p
 # else
-pair :: (Aeson.ToJSON value, Aeson.KeyValue pair) => String -> value -> pair
+pair :: (Aeson.ToJSON value, Aeson.KeyValue p) => String -> value -> p
 # endif
 pair key value = Key.fromString key Aeson..= value
 
