diff --git a/CHANGELOG.md b/CHANGELOG.md
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -1,3 +1,6 @@
+### 3.9.1 [2021.08.29]
+* Require `base-orphans-0.8.5` or later in the test suite.
+
 ## 3.9 [2020.10.03]
 * Allow building with GHC 9.0.
 * Remove `TextShow(1)` instances for `Data.Semigroup.Option`, which is
diff --git a/README.md b/README.md
--- a/README.md
+++ b/README.md
@@ -3,7 +3,7 @@
 [![Hackage Dependencies](https://img.shields.io/hackage-deps/v/text-show.svg)](http://packdeps.haskellers.com/reverse/text-show)
 [![Haskell Programming Language](https://img.shields.io/badge/language-Haskell-blue.svg)][Haskell.org]
 [![BSD3 License](http://img.shields.io/badge/license-BSD3-brightgreen.svg)][tl;dr Legal: BSD3]
-[![Linux build](https://img.shields.io/travis/RyanGlScott/text-show.svg)](https://travis-ci.org/RyanGlScott/text-show)
+[![Linux build](https://github.com/RyanGlScott/text-show/workflows/Haskell-CI/badge.svg)](https://github.com/RyanGlScott/text-show/actions?query=workflow%3AHaskell-CI)
 [![Windows build](https://ci.appveyor.com/api/projects/status/fy1q86lbfttmnthy?svg=true)](https://ci.appveyor.com/project/RyanGlScott/text-show)
 
 [Hackage: text-show]:
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
@@ -204,7 +204,9 @@
           _ ->
            let
              (ei,is') = roundTo 1 is
-             n:_ = map i2d (if ei > 0 then init is' else is')
+             n = case map i2d (if ei > 0 then init is' else is') of
+                   n':_ -> n'
+                   []   -> error "formatRealFloatAltB (Exponent, negative decs): Unexpected empty list"
            in singleton n <> singleton 'e' <> decimal (e-1+ei)
        Just dec ->
         let dec' = max dec 1 in
@@ -213,7 +215,9 @@
          _ ->
           let
            (ei,is') = roundTo (dec'+1) is
-           (d:ds') = map i2d (if ei > 0 then init is' else is')
+           (d,ds') = case map i2d (if ei > 0 then init is' else is') of
+                       (d':ds'') -> (d',ds'')
+                       []        -> error "formatRealFloatAltB (Exponent, non-negative decs): Unexpected empty list"
           in
           singleton d <> singleton '.' <> fromString ds' <> singleton 'e' <> decimal (e-1+ei)
      Fixed ->
@@ -241,7 +245,9 @@
         else
          let
           (ei,is') = roundTo dec' (replicate (-e) 0 ++ is)
-          d:ds' = map i2d (if ei > 0 then is' else 0:is')
+          (d,ds') = case map i2d (if ei > 0 then is' else 0:is') of
+                      (d':ds'') -> (d',ds'')
+                      []        -> error "formatRealFloatAltB (Fixed): Unexpected empty list"
          in
          singleton d <> (if null ds' && not alt then "" else singleton '.' <> fromString ds')
 
diff --git a/src/TextShow/TH/Internal.hs b/src/TextShow/TH/Internal.hs
--- a/src/TextShow/TH/Internal.hs
+++ b/src/TextShow/TH/Internal.hs
@@ -78,7 +78,13 @@
                           , Char#, Double#, Float#, Int#, Word#
 #if MIN_VERSION_base(4,13,0)
                           , Int8#, Int16#, Word8#, Word16#
+# if MIN_VERSION_base(4,16,0)
+                          , int8ToInt#, int16ToInt#, intToInt8#, intToInt16#
+                          , word8ToWord#, word16ToWord#, wordToWord8#, wordToWord16#
+# else
                           , extendInt8#, extendInt16#, extendWord8#, extendWord16#
+                          , narrowInt8#, narrowInt16#, narrowWord8#, narrowWord16#
+# endif
 #endif
                           )
 import           GHC.Show (appPrec, appPrec1)
@@ -1258,36 +1264,100 @@
                     })
 #if MIN_VERSION_base(4,13,0)
     , (''Int8#,   PrimShow
-                    { primShowBoxer      = appE (conE 'I#) . appE (varE 'extendInt8#)
+                    { primShowBoxer      = appE (conE 'I#) . appE (varE int8ToIntHashValName)
                     , primShowPostfixMod = oneHashE
-                    , primShowConv       = mkNarrowE "narrowInt8#"
+                    , primShowConv       = mkNarrowE intToInt8HashValName
                     })
     , (''Int16#,  PrimShow
-                    { primShowBoxer      = appE (conE 'I#) . appE (varE 'extendInt16#)
+                    { primShowBoxer      = appE (conE 'I#) . appE (varE int16ToIntHashValName)
                     , primShowPostfixMod = oneHashE
-                    , primShowConv       = mkNarrowE "narrowInt16#"
+                    , primShowConv       = mkNarrowE intToInt16HashValName
                     })
     , (''Word8#,  PrimShow
-                    { primShowBoxer      = appE (conE 'W#) . appE (varE 'extendWord8#)
+                    { primShowBoxer      = appE (conE 'W#) . appE (varE word8ToWordHashValName)
                     , primShowPostfixMod = twoHashE
-                    , primShowConv       = mkNarrowE "narrowWord8#"
+                    , primShowConv       = mkNarrowE wordToWord8HashValName
                     })
     , (''Word16#, PrimShow
-                    { primShowBoxer      = appE (conE 'W#) . appE (varE 'extendWord16#)
+                    { primShowBoxer      = appE (conE 'W#) . appE (varE word16ToWordHashValName)
                     , primShowPostfixMod = twoHashE
-                    , primShowConv       = mkNarrowE "narrowWord16#"
+                    , primShowConv       = mkNarrowE wordToWord16HashValName
                     })
 #endif
     ]
 
 #if MIN_VERSION_base(4,13,0)
-mkNarrowE :: String -> TextShowFun -> Q Exp -> Q Exp
-mkNarrowE narrowStr tsFun e =
+mkNarrowE :: Name -> TextShowFun -> Q Exp -> Q Exp
+mkNarrowE narrowName tsFun e =
   foldr (`infixApp` [| (<>) |])
         (varE (singletonName tsFun) `appE` charE ')')
-        [ varE (fromStringName tsFun) `appE` stringE ('(':narrowStr ++ " ")
+        [ varE (fromStringName tsFun) `appE` stringE ('(':nameBase narrowName ++ " ")
         , e
         ]
+
+int8ToIntHashValName :: Name
+int8ToIntHashValName =
+# if MIN_VERSION_base(4,16,0)
+  'int8ToInt#
+# else
+  'extendInt8#
+# endif
+
+int16ToIntHashValName :: Name
+int16ToIntHashValName =
+# if MIN_VERSION_base(4,16,0)
+  'int16ToInt#
+# else
+  'extendInt16#
+# endif
+
+intToInt8HashValName :: Name
+intToInt8HashValName =
+# if MIN_VERSION_base(4,16,0)
+  'intToInt8#
+# else
+  'narrowInt8#
+# endif
+
+intToInt16HashValName :: Name
+intToInt16HashValName =
+# if MIN_VERSION_base(4,16,0)
+  'intToInt16#
+# else
+  'narrowInt16#
+# endif
+
+word8ToWordHashValName :: Name
+word8ToWordHashValName =
+# if MIN_VERSION_base(4,16,0)
+  'word8ToWord#
+# else
+  'extendWord8#
+# endif
+
+word16ToWordHashValName :: Name
+word16ToWordHashValName =
+# if MIN_VERSION_base(4,16,0)
+  'word16ToWord#
+# else
+  'extendWord16#
+# endif
+
+wordToWord8HashValName :: Name
+wordToWord8HashValName =
+# if MIN_VERSION_base(4,16,0)
+  'wordToWord8#
+# else
+  'narrowWord8#
+# endif
+
+wordToWord16HashValName :: Name
+wordToWord16HashValName =
+# if MIN_VERSION_base(4,16,0)
+  'wordToWord16#
+# else
+  'narrowWord16#
+# endif
 #endif
 
 oneHashE, twoHashE :: TextShowFun -> Q Exp
diff --git a/tests/Derived/MagicHash.hs b/tests/Derived/MagicHash.hs
--- a/tests/Derived/MagicHash.hs
+++ b/tests/Derived/MagicHash.hs
@@ -124,8 +124,8 @@
       I# i2 <- arbitrary
       W# w1 <- arbitrary
       W# w2 <- arbitrary
-      pure $ TyCon'# a b (narrowInt8# i1)  (narrowInt16# i2)
-                         (narrowWord8# w1) (narrowWord16# w2)
+      pure $ TyCon'# a b (intToInt8Compat# i1)   (intToInt16Compat# i2)
+                         (wordToWord8Compat# w1) (wordToWord16Compat# w2)
 
 instance (Arbitrary a, Arbitrary b) => Arbitrary (TyFamily'# a b) where
     arbitrary = do
@@ -135,8 +135,34 @@
       I# i2 <- arbitrary
       W# w1 <- arbitrary
       W# w2 <- arbitrary
-      pure $ TyFamily'# a b (narrowInt8# i1)  (narrowInt16# i2)
-                            (narrowWord8# w1) (narrowWord16# w2)
+      pure $ TyFamily'# a b (intToInt8Compat# i1)   (intToInt16Compat# i2)
+                            (wordToWord8Compat# w1) (wordToWord16Compat# w2)
+
+# if MIN_VERSION_base(4,16,0)
+intToInt8Compat# :: Int# -> Int8#
+intToInt8Compat# = intToInt8#
+
+intToInt16Compat# :: Int# -> Int16#
+intToInt16Compat# = intToInt16#
+
+wordToWord8Compat# :: Word# -> Word8#
+wordToWord8Compat# = wordToWord8#
+
+wordToWord16Compat# :: Word# -> Word16#
+wordToWord16Compat# = wordToWord16#
+# else
+intToInt8Compat# :: Int# -> Int8#
+intToInt8Compat# = narrowInt8#
+
+intToInt16Compat# :: Int# -> Int16#
+intToInt16Compat# = narrowInt16#
+
+wordToWord8Compat# :: Word# -> Word8#
+wordToWord8Compat# = narrowWord8#
+
+wordToWord16Compat# :: Word# -> Word16#
+wordToWord16Compat# = narrowWord16#
+# endif
 #endif
 
 -------------------------------------------------------------------------------
diff --git a/tests/Derived/TypeSynonyms.hs b/tests/Derived/TypeSynonyms.hs
--- a/tests/Derived/TypeSynonyms.hs
+++ b/tests/Derived/TypeSynonyms.hs
@@ -77,10 +77,12 @@
 
 -------------------------------------------------------------------------------
 
--- TODO: Replace these with non-orphan instances
+-- TODO: Consider backporting these instances somewhere
+#if !(MIN_VERSION_base(4,9,0))
 $(deriveShow1 ''(,,,))
-#if defined(NEW_FUNCTOR_CLASSES)
+# if defined(NEW_FUNCTOR_CLASSES)
 $(deriveShow2 ''(,,,))
+# endif
 #endif
 
 $(deriveShow1 ''TyCon)
diff --git a/tests/Instances/Data/Tuple.hs b/tests/Instances/Data/Tuple.hs
--- a/tests/Instances/Data/Tuple.hs
+++ b/tests/Instances/Data/Tuple.hs
@@ -1,3 +1,4 @@
+{-# LANGUAGE CPP                #-}
 {-# LANGUAGE DeriveGeneric      #-}
 {-# LANGUAGE StandaloneDeriving #-}
 {-# OPTIONS_GHC -fno-warn-orphans #-}
@@ -15,10 +16,13 @@
 module Instances.Data.Tuple () where
 
 import Data.Orphans ()
-import GHC.Generics (Generic)
 import Instances.Utils.GenericArbitrary (genericArbitrary)
 import Test.QuickCheck (Arbitrary(..))
 
+#if !(MIN_VERSION_base(4,16,0))
+import GHC.Generics (Generic)
+#endif
+
 instance ( Arbitrary a
          , Arbitrary b
          , Arbitrary c
@@ -99,8 +103,11 @@
          ) => Arbitrary (a, b, c, d, e, f, g, h, i, j, k, l, m, n, o) where
     arbitrary = genericArbitrary
 
+-- TODO: Replace these instances with generic-deriving
+#if !(MIN_VERSION_base(4,16,0))
 deriving instance Generic (a, b, c, d, e, f, g, h, i, j, k)
 deriving instance Generic (a, b, c, d, e, f, g, h, i, j, k, l)
 deriving instance Generic (a, b, c, d, e, f, g, h, i, j, k, l, m)
 deriving instance Generic (a, b, c, d, e, f, g, h, i, j, k, l, m, n)
 deriving instance Generic (a, b, c, d, e, f, g, h, i, j, k, l, m, n, o)
+#endif
diff --git a/tests/Instances/Data/Typeable.hs b/tests/Instances/Data/Typeable.hs
--- a/tests/Instances/Data/Typeable.hs
+++ b/tests/Instances/Data/Typeable.hs
@@ -36,8 +36,12 @@
 
 #if MIN_VERSION_base(4,10,0)
 import GHC.Exts (Int(..), Ptr(..))
-import GHC.Types (KindRep(..), RuntimeRep(..), TypeLitSort(..),
-                  VecCount(..), VecElem(..))
+import GHC.Types ( KindRep(..), RuntimeRep(..), TypeLitSort(..)
+                 , VecCount(..), VecElem(..)
+# if MIN_VERSION_base(4,16,0)
+                 , Levity(..)
+# endif
+                 )
 import Type.Reflection (SomeTypeRep(..), Typeable, TypeRep, typeRep)
 #else
 import Data.Typeable.Internal (TypeRep(..))
@@ -80,8 +84,13 @@
     arbitrary = oneof [ VecRep <$> arbitrary <*> arbitrary
                       , pure $ TupleRep []
                       , pure $ SumRep []
+# if MIN_VERSION_base(4,16,0)
+                      , pure $ BoxedRep Lifted
+                      , pure $ BoxedRep Unlifted
+# else
                       , pure LiftedRep
                       , pure UnliftedRep
+# endif
                       , pure IntRep
                       , pure WordRep
                       , pure Int64Rep
diff --git a/tests/Spec/BuilderSpec.hs b/tests/Spec/BuilderSpec.hs
--- a/tests/Spec/BuilderSpec.hs
+++ b/tests/Spec/BuilderSpec.hs
@@ -12,7 +12,7 @@
 
 import Instances.Data.Text ()
 
-import Test.Hspec (Spec, describe, hspec, parallel)
+import Test.Hspec (Expectation, Spec, describe, hspec, parallel, shouldBe)
 import Test.Hspec.QuickCheck (prop)
 
 import TextShow (Builder, fromString, fromText, lengthB,
@@ -22,24 +22,24 @@
 main = hspec spec
 
 -- | Verifies 'lengthB' and 'length' produce the same output.
-prop_lengthB :: String -> Bool
-prop_lengthB s = fromIntegral (lengthB $ fromString s) == length s
+prop_lengthB :: String -> Expectation
+prop_lengthB s = fromIntegral (lengthB $ fromString s) `shouldBe` length s
 
 -- | Verifies @fromText . toText = id@.
-prop_toText :: Builder -> Bool
-prop_toText b = fromText (toText b) == b
+prop_toText :: Builder -> Expectation
+prop_toText b = fromText (toText b) `shouldBe` b
 
 -- | Verifies @fromString . toString = id@.
-prop_toString :: Builder -> Bool
-prop_toString b = fromString (toString b) == b
+prop_toString :: Builder -> Expectation
+prop_toString b = fromString (toString b) `shouldBe` b
 
 -- | Verifies 'unlinesB' and 'unlines' produce the same output.
-prop_unlinesB :: [String] -> Bool
-prop_unlinesB strs = unlinesB (map fromString strs) == fromString (unlines strs)
+prop_unlinesB :: [String] -> Expectation
+prop_unlinesB strs = unlinesB (map fromString strs) `shouldBe` fromString (unlines strs)
 
 -- | Verifies 'unwordsB' and 'unwords' produce the same output.
-prop_unwordsB :: [String] -> Bool
-prop_unwordsB strs = unwordsB (map fromString strs) == fromString (unwords strs)
+prop_unwordsB :: [String] -> Expectation
+prop_unwordsB strs = unwordsB (map fromString strs) `shouldBe` fromString (unwords strs)
 
 spec :: Spec
 spec = parallel $ do
diff --git a/tests/Spec/Data/FixedSpec.hs b/tests/Spec/Data/FixedSpec.hs
--- a/tests/Spec/Data/FixedSpec.hs
+++ b/tests/Spec/Data/FixedSpec.hs
@@ -15,7 +15,7 @@
 
 import Spec.Utils (matchesTextShowSpec)
 
-import Test.Hspec (Spec, describe, hspec, parallel)
+import Test.Hspec (Expectation, Spec, describe, hspec, parallel, shouldBe)
 import Test.Hspec.QuickCheck (prop)
 
 import TextShow (fromString)
@@ -44,5 +44,5 @@
         prop "has the same output as showFixed" prop_showFixed
 
 -- | Verifies 'showFixed' and 'showbFixed' generate the same output.
-prop_showFixed :: Bool -> Fixed E12 -> Bool
-prop_showFixed b f = fromString (showFixed b f) == showbFixed b f
+prop_showFixed :: Bool -> Fixed E12 -> Expectation
+prop_showFixed b f = fromString (showFixed b f) `shouldBe` showbFixed b f
diff --git a/tests/Spec/Data/IntegralSpec.hs b/tests/Spec/Data/IntegralSpec.hs
--- a/tests/Spec/Data/IntegralSpec.hs
+++ b/tests/Spec/Data/IntegralSpec.hs
@@ -31,6 +31,7 @@
 import Numeric (showIntAtBase)
 
 import Test.QuickCheck (Gen, arbitrary, getNonNegative, suchThat)
+import Test.Hspec (Expectation, shouldBe)
 import Test.Hspec.QuickCheck (prop)
 
 import TextShow (fromString)
@@ -72,9 +73,9 @@
 
 -- | Verifies 'showIntAtBase' and 'showbIntAtBase' generate the same output.
 #if !defined(mingw32_HOST_OS) && MIN_VERSION_text(1,0,0)
-prop_showIntAtBase :: Gen Bool
+prop_showIntAtBase :: Gen Expectation
 prop_showIntAtBase = do
     base <- arbitrary `suchThat` liftA2 (&&) (> 1) (<= 16)
     i    <- getNonNegative <$> arbitrary :: Gen Int
-    pure $ fromString (showIntAtBase base intToDigit i "") == showbIntAtBase base intToDigit i
+    pure $ fromString (showIntAtBase base intToDigit i "") `shouldBe` showbIntAtBase base intToDigit i
 #endif
diff --git a/tests/Spec/Data/ListSpec.hs b/tests/Spec/Data/ListSpec.hs
--- a/tests/Spec/Data/ListSpec.hs
+++ b/tests/Spec/Data/ListSpec.hs
@@ -14,7 +14,7 @@
 
 import Spec.Utils (matchesTextShowSpec)
 
-import Test.Hspec (Spec, describe, hspec, parallel)
+import Test.Hspec (Expectation, Spec, describe, hspec, parallel, shouldBe)
 import Test.Hspec.QuickCheck (prop)
 
 import Text.Show (showListWith)
@@ -36,5 +36,5 @@
         prop "has the same output as showListWith" prop_showListWith
 
 -- | Verifies 'showListWith' and 'showbListWith' generate the same output.
-prop_showListWith :: String -> Bool
-prop_showListWith str = fromString (showListWith shows str "") == showbListWith showb str
+prop_showListWith :: String -> Expectation
+prop_showListWith str = fromString (showListWith shows str "") `shouldBe` showbListWith showb str
diff --git a/tests/Spec/Data/VersionSpec.hs b/tests/Spec/Data/VersionSpec.hs
--- a/tests/Spec/Data/VersionSpec.hs
+++ b/tests/Spec/Data/VersionSpec.hs
@@ -5,7 +5,7 @@
 
 import Spec.Utils (matchesTextShowSpec)
 
-import Test.Hspec (Spec, describe, hspec, parallel)
+import Test.Hspec (Expectation, Spec, describe, hspec, parallel, shouldBe)
 import Test.Hspec.QuickCheck (prop)
 
 import TextShow (fromString)
@@ -22,5 +22,5 @@
         prop "has the same output as showVersion" prop_showVersion
 
 -- | Verifies 'showVersion' and 'showbVersion' generate the same output.
-prop_showVersion :: Version -> Bool
-prop_showVersion v = fromString (showVersion v) == showbVersion v
+prop_showVersion :: Version -> Expectation
+prop_showVersion v = fromString (showVersion v) `shouldBe` showbVersion v
diff --git a/tests/Spec/Utils.hs b/tests/Spec/Utils.hs
--- a/tests/Spec/Utils.hs
+++ b/tests/Spec/Utils.hs
@@ -28,7 +28,7 @@
 
 import Generics.Deriving.Base
 
-import Test.Hspec (Spec)
+import Test.Hspec (Expectation, Spec, shouldBe)
 import Test.Hspec.QuickCheck (prop)
 import Test.QuickCheck (Arbitrary)
 
@@ -44,24 +44,24 @@
 -- irrespective of precedence.
 matchesTextShowSpec :: forall a. (Arbitrary a, Show a, TextShow a)
                     => Proxy a -> Spec
-matchesTextShowSpec _ = prop "TextShow instance" (prop_matchesTextShow :: Int -> a -> Bool)
+matchesTextShowSpec _ = prop "TextShow instance" (prop_matchesTextShow :: Int -> a -> Expectation)
 
 -- | Verifies that a type's 'Show' instances coincide for both 'String's and 'Text',
 -- irrespective of precedence.
-prop_matchesTextShow :: (Show a, TextShow a) => Int -> a -> Bool
-prop_matchesTextShow p x = fromString (showsPrec p x "") == showbPrec p x
+prop_matchesTextShow :: (Show a, TextShow a) => Int -> a -> Expectation
+prop_matchesTextShow p x = fromString (showsPrec p x "") `shouldBe` showbPrec p x
 
 -- | Expect a type's 'Show1' instances to coincide for both 'String's and 'Text',
 -- irrespective of precedence.
 matchesTextShow1Spec :: forall f a.
                         (Arbitrary (f a), Show1 f, Show a, Show (f a), TextShow1 f, TextShow a)
                      => Proxy (f a) -> Spec
-matchesTextShow1Spec _ = prop "TextShow1 instance" (prop_matchesTextShow1 :: Int -> f a -> Bool)
+matchesTextShow1Spec _ = prop "TextShow1 instance" (prop_matchesTextShow1 :: Int -> f a -> Expectation)
 
 -- | Verifies that a type's 'Show1' instances coincide for both 'String's and 'Text',
 -- irrespective of precedence.
-prop_matchesTextShow1 :: (Show1 f, Show a, TextShow1 f, TextShow a) => Int -> f a -> Bool
-prop_matchesTextShow1 p x = fromString (showsPrec1 p x "") == showbPrec1 p x
+prop_matchesTextShow1 :: (Show1 f, Show a, TextShow1 f, TextShow a) => Int -> f a -> Expectation
+prop_matchesTextShow1 p x = fromString (showsPrec1 p x "") `shouldBe` showbPrec1 p x
 
 #if defined(NEW_FUNCTOR_CLASSES)
 -- | Expect a type's 'Show2' instances to coincide for both 'String's and 'Text',
@@ -70,13 +70,13 @@
                         (Arbitrary (f a b), Show2 f, Show a, Show b, Show (f a b),
                          TextShow2 f, TextShow a, TextShow b)
                      => Proxy (f a b) -> Spec
-matchesTextShow2Spec _ = prop "TextShow2 instance" (prop_matchesTextShow2 :: Int -> f a b -> Bool)
+matchesTextShow2Spec _ = prop "TextShow2 instance" (prop_matchesTextShow2 :: Int -> f a b -> Expectation)
 
 -- | Verifies that a type's 'Show2' instances coincide for both 'String's and 'Text',
 -- irrespective of precedence.
 prop_matchesTextShow2 :: (Show2 f, Show a, Show b, TextShow2 f, TextShow a, TextShow b)
-                      => Int -> f a b -> Bool
-prop_matchesTextShow2 p x = fromString (showsPrec2 p x "") == showbPrec2 p x
+                      => Int -> f a b -> Expectation
+prop_matchesTextShow2 p x = fromString (showsPrec2 p x "") `shouldBe` showbPrec2 p x
 #endif
 
 -- | Expect a type's 'TextShow' instance to coincide with the output produced
@@ -84,26 +84,26 @@
 genericTextShowSpec :: forall a. (Arbitrary a, Show a, TextShow a,
                                   Generic a, GTextShowB Zero (Rep a))
                     => Proxy a -> Spec
-genericTextShowSpec _ = prop "generic TextShow" (prop_genericTextShow  :: Int -> a -> Bool)
+genericTextShowSpec _ = prop "generic TextShow" (prop_genericTextShow  :: Int -> a -> Expectation)
 
 -- | Verifies that a type's 'TextShow' instance coincides with the output produced
 -- by the equivalent 'Generic' functions.
 prop_genericTextShow :: (TextShow a, Generic a, GTextShowB Zero (Rep a))
-                     => Int -> a -> Bool
-prop_genericTextShow p x = showbPrec p x == genericShowbPrec p x
+                     => Int -> a -> Expectation
+prop_genericTextShow p x = showbPrec p x `shouldBe` genericShowbPrec p x
 
 -- | Expect a type's 'TextShow1' instance to coincide with the output produced
 -- by the equivalent 'Generic1' functions.
 genericTextShow1Spec :: forall f a. (Arbitrary (f a), Show (f a), TextShow1 f,
                                      Generic1 f, GTextShowB One (Rep1 f), TextShow a)
                      => Proxy (f a) -> Spec
-genericTextShow1Spec _ = prop "generic TextShow1" (prop_genericTextShow1 :: Int -> f a -> Bool)
+genericTextShow1Spec _ = prop "generic TextShow1" (prop_genericTextShow1 :: Int -> f a -> Expectation)
 
 -- | Verifies that a type's 'TextShow1' instance coincides with the output produced
 -- by the equivalent 'Generic1' functions.
 prop_genericTextShow1 :: ( TextShow1 f, Generic1 f
                          , GTextShowB One (Rep1 f), TextShow a
                          )
-                      => Int -> f a -> Bool
+                      => Int -> f a -> Expectation
 prop_genericTextShow1 p x =
-    showbPrec1 p x == genericLiftShowbPrec showbPrec showbList p x
+    showbPrec1 p x `shouldBe` genericLiftShowbPrec showbPrec showbList p x
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.9
+version:             3.9.1
 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
@@ -51,8 +51,9 @@
                    , GHC == 8.2.2
                    , GHC == 8.4.4
                    , GHC == 8.6.5
-                   , GHC == 8.8.3
-                   , GHC == 8.10.1
+                   , GHC == 8.8.4
+                   , GHC == 8.10.4
+                   , GHC == 9.0.1
 extra-source-files:  CHANGELOG.md, README.md, include/*.h
 cabal-version:       >=1.10
 
@@ -155,9 +156,9 @@
                        TextShow.TH.Names
                        TextShow.Utils
   build-depends:       array                 >= 0.3    && < 0.6
-                     , base-compat-batteries >= 0.11   && < 0.12
+                     , base-compat-batteries >= 0.11   && < 0.13
                      , bifunctors            >= 5.1    && < 6
-                     , bytestring            >= 0.9    && < 0.11
+                     , bytestring            >= 0.9    && < 0.12
                      , bytestring-builder
                      , containers            >= 0.1    && < 0.7
                      , generic-deriving      >= 1.11   && < 2
@@ -339,9 +340,9 @@
 
                        TextShow.TH.Names
   build-depends:       array                 >= 0.3    && < 0.6
-                     , base-compat-batteries >= 0.11   && < 0.12
-                     , base-orphans          >= 0.8.2  && < 0.9
-                     , bytestring            >= 0.9    && < 0.11
+                     , base-compat-batteries >= 0.11   && < 0.13
+                     , base-orphans          >= 0.8.5  && < 0.9
+                     , bytestring            >= 0.9    && < 0.12
                      , bytestring-builder
                      , deriving-compat       >= 0.5.6  && < 1
                      , generic-deriving      >= 1.11   && < 2
