diff --git a/CHANGELOG.md b/CHANGELOG.md
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -1,3 +1,7 @@
+### 3.11.3 [2026.01.08]
+* Make the test suite pass with `base-4.22.*` (GHC 9.14).
+* Support building the test suite with `QuickCheck-2.17.*`.
+
 ### 3.11.2 [2025.06.17]
 * Support building with the GHC JavaScript backend.
 
diff --git a/src/TextShow/Data/Array.hs b/src/TextShow/Data/Array.hs
--- a/src/TextShow/Data/Array.hs
+++ b/src/TextShow/Data/Array.hs
@@ -34,10 +34,6 @@
 import           TextShow.Data.List ()
 import           TextShow.Data.Tuple ()
 
-{-# SPECIALIZE
-    showbIArrayPrec :: (IArray UArray e, Ix i, TextShow i, TextShow e) =>
-                        Int -> UArray i e -> Builder
-  #-}
 -- | Convert an 'IArray' instance to a 'Builder' with the given precedence.
 --
 -- /Since: 2/
diff --git a/src/TextShow/Data/Floating.hs b/src/TextShow/Data/Floating.hs
--- a/src/TextShow/Data/Floating.hs
+++ b/src/TextShow/Data/Floating.hs
@@ -71,15 +71,12 @@
     | otherwise                 = showbGFloat Nothing x
 {-# INLINE showbRealFloatPrec #-}
 
-{-# SPECIALIZE showbEFloat ::
-        Maybe Int -> Float  -> Builder,
-        Maybe Int -> Double -> Builder #-}
-{-# SPECIALIZE showbFFloat ::
-        Maybe Int -> Float  -> Builder,
-        Maybe Int -> Double -> Builder #-}
-{-# SPECIALIZE showbGFloat ::
-        Maybe Int -> Float  -> Builder,
-        Maybe Int -> Double -> Builder #-}
+{-# SPECIALIZE showbEFloat :: Maybe Int -> Float  -> Builder #-}
+{-# SPECIALIZE showbEFloat :: Maybe Int -> Double -> Builder #-}
+{-# SPECIALIZE showbFFloat :: Maybe Int -> Float  -> Builder #-}
+{-# SPECIALIZE showbFFloat :: Maybe Int -> Double -> Builder #-}
+{-# SPECIALIZE showbGFloat :: Maybe Int -> Float  -> Builder #-}
+{-# SPECIALIZE showbGFloat :: Maybe Int -> Double -> Builder #-}
 
 -- | Show a signed 'RealFloat' value
 -- using scientific (exponential) notation (e.g. @2.45e2@, @1.5e-3@).
diff --git a/src/TextShow/Data/Typeable.hs b/src/TextShow/Data/Typeable.hs
--- a/src/TextShow/Data/Typeable.hs
+++ b/src/TextShow/Data/Typeable.hs
@@ -97,8 +97,13 @@
 #if MIN_VERSION_base(4,20,0)
 isTupleTyCon :: TyCon -> Maybe (Bool, Int)
 isTupleTyCon tc
+# if MIN_VERSION_base(4,22,0)
+  | tyConPackage tc == "ghc-internal"
+  , tyConModule  tc == "GHC.Internal.Tuple" || tyConModule tc == "GHC.Internal.Types"
+# else
   | tyConPackage tc == "ghc-prim"
   , tyConModule  tc == "GHC.Tuple" || tyConModule tc == "GHC.Types"
+# endif
   = case tyConName tc of
       "Unit" -> Just (True, 0)
       "Unit#" -> Just (False, 0)
diff --git a/tests/Instances/Data/Char.hs b/tests/Instances/Data/Char.hs
--- a/tests/Instances/Data/Char.hs
+++ b/tests/Instances/Data/Char.hs
@@ -1,3 +1,4 @@
+{-# LANGUAGE CPP #-}
 {-# OPTIONS_GHC -Wno-orphans #-}
 
 {-|
@@ -12,8 +13,10 @@
 -}
 module Instances.Data.Char () where
 
+#if !MIN_VERSION_QuickCheck(2,17,0)
 import Data.Char (GeneralCategory)
 import Test.QuickCheck (Arbitrary(..), arbitraryBoundedEnum)
 
 instance Arbitrary GeneralCategory where
     arbitrary = arbitraryBoundedEnum
+#endif
diff --git a/tests/Instances/Data/Ord.hs b/tests/Instances/Data/Ord.hs
--- a/tests/Instances/Data/Ord.hs
+++ b/tests/Instances/Data/Ord.hs
@@ -1,3 +1,4 @@
+{-# LANGUAGE CPP #-}
 {-# LANGUAGE GeneralizedNewtypeDeriving #-}
 {-# LANGUAGE StandaloneDeriving         #-}
 {-# OPTIONS_GHC -Wno-orphans #-}
@@ -14,7 +15,9 @@
 -}
 module Instances.Data.Ord () where
 
+#if !MIN_VERSION_QuickCheck(2,17,0)
 import GHC.Exts (Down(..))
 import Test.QuickCheck (Arbitrary)
 
 deriving instance Arbitrary a => Arbitrary (Down a)
+#endif
diff --git a/tests/Instances/Data/Semigroup.hs b/tests/Instances/Data/Semigroup.hs
--- a/tests/Instances/Data/Semigroup.hs
+++ b/tests/Instances/Data/Semigroup.hs
@@ -1,3 +1,4 @@
+{-# LANGUAGE CPP #-}
 {-# OPTIONS_GHC -Wno-orphans #-}
 
 {-|
@@ -12,9 +13,11 @@
 -}
 module Instances.Data.Semigroup () where
 
+#if !MIN_VERSION_QuickCheck(2,17,0)
 import Data.Semigroup (Arg(..))
 import Instances.Utils.GenericArbitrary (genericArbitrary)
 import Test.QuickCheck (Arbitrary(..))
 
 instance (Arbitrary a, Arbitrary b) => Arbitrary (Arg a b) where
     arbitrary = genericArbitrary
+#endif
diff --git a/tests/Instances/System/IO.hs b/tests/Instances/System/IO.hs
--- a/tests/Instances/System/IO.hs
+++ b/tests/Instances/System/IO.hs
@@ -1,3 +1,4 @@
+{-# LANGUAGE CPP                #-}
 {-# LANGUAGE DeriveGeneric      #-}
 {-# LANGUAGE StandaloneDeriving #-}
 {-# OPTIONS_GHC -Wno-orphans #-}
@@ -36,15 +37,21 @@
     arbitrary = genericArbitrary
 
 deriving instance Bounded IOMode
+#if !MIN_VERSION_QuickCheck(2,17,0)
 instance Arbitrary IOMode where
     arbitrary = arbitraryBoundedEnum
+#endif
 
+#if !MIN_VERSION_QuickCheck(2,17,0)
 instance Arbitrary BufferMode where
     arbitrary = genericArbitrary
+#endif
 
 deriving instance Bounded SeekMode
+#if !MIN_VERSION_QuickCheck(2,17,0)
 instance Arbitrary SeekMode where
     arbitrary = arbitraryBoundedEnum
+#endif
 
 deriving instance Bounded CodingProgress
 deriving instance Enum CodingProgress
diff --git a/text-show.cabal b/text-show.cabal
--- a/text-show.cabal
+++ b/text-show.cabal
@@ -1,5 +1,5 @@
 name:                text-show
-version:             3.11.2
+version:             3.11.3
 synopsis:            Efficient conversion of values into Text
 description:         @text-show@ offers a replacement for the @Show@ typeclass intended
                      for use with @Text@ instead of @String@s. This package was created
@@ -63,8 +63,9 @@
                    , GHC == 9.4.8
                    , GHC == 9.6.7
                    , GHC == 9.8.4
-                   , GHC == 9.10.2
+                   , GHC == 9.10.3
                    , GHC == 9.12.2
+                   , GHC == 9.14.1
 extra-source-files:  CHANGELOG.md, README.md
 cabal-version:       >=1.10
 
@@ -150,18 +151,16 @@
                        TextShow.TH.Names
                        TextShow.Utils
   build-depends:       array                 >= 0.3      && < 0.6
-                     , base                  >= 4.9      && < 4.22
+                     , base                  >= 4.9      && < 4.23
                      , base-compat-batteries >= 0.11     && < 0.15
                      , bifunctors            >= 5.1      && < 6
                      , bytestring            >= 0.10.8.1 && < 0.13
                      , containers            >= 0.1      && < 0.9
-                     , ghc-boot-th           >= 8.0      && < 9.13
+                     , ghc-boot-th           >= 8.0      && < 9.15
                      , ghc-prim
-                     , template-haskell      >= 2.11     && < 2.24
+                     , template-haskell      >= 2.11     && < 2.25
                      , text                  >= 1.1      && < 2.2
                      , th-abstraction        >= 0.5      && < 0.8
-                     , transformers          >= 0.5      && < 0.7
-                     , transformers-compat   >= 0.5      && < 1
 
   -- integer-gmp is only needed on pre-9.0 versions of GHC, as GHC 9.0+ add
   -- enough functionality to base to avoid the use of integer-gmp entirely.
@@ -302,7 +301,7 @@
 
                        TextShow.TH.Names
   build-depends:       array                 >= 0.3      && < 0.6
-                     , base                  >= 4.9      && < 4.22
+                     , base                  >= 4.9      && < 4.23
                      , base-compat-batteries >= 0.11     && < 0.15
                      , base-orphans          >= 0.8.5    && < 0.10
                      , bytestring            >= 0.10.8.1 && < 0.13
@@ -310,12 +309,11 @@
                      , generic-deriving      >= 1.14.1   && < 2
                      , ghc-prim
                      , hspec                 >= 2        && < 3
-                     , QuickCheck            >= 2.14.3   && < 2.17
-                     , quickcheck-instances  >= 0.3.28   && < 0.4
-                     , template-haskell      >= 2.11     && < 2.24
+                     , QuickCheck            >= 2.14.3   && < 2.18
+                     , quickcheck-instances  >= 0.3.28   && < 0.5
+                     , template-haskell      >= 2.11     && < 2.25
                      , text                  >= 1.1      && < 2.2
                      , text-show
-                     , transformers          >= 0.5      && < 0.7
                      , transformers-compat   >= 0.5      && < 1
   build-tool-depends:  hspec-discover:hspec-discover
 
@@ -330,10 +328,9 @@
 benchmark bench
   type:                exitcode-stdio-1.0
   main-is:             Bench.hs
-  build-depends:       base      >= 4.9    && < 4.22
+  build-depends:       base      >= 4.9    && < 4.23
                      , criterion >= 1.1.4  && < 2
                      , deepseq   >= 1.3    && < 2
-                     , ghc-prim
                      , text-show
                      , text      >= 1.1    && < 2.2
 
