diff --git a/CHANGELOG.md b/CHANGELOG.md
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -1,3 +1,12 @@
+## 3
+* GHC 8.0 support
+* Rename functions that previously ended with the suffix `-With` to instead have the prefix `lift-`, consistent with `text-show-3`
+* Removed the `TextShow.Data.Semigroup` and `TextShow.Data.List.NonEmpty` modules, as they have been moved to `text-show-3` (as part of moving `Semigroup` into `base`)
+* Removed the functions for `Compose`, `Product`, and `Sum` in `TextShow.Data.Functor.Trans`, as they have been moved to `text-show-3` (as part of moving them to `base`)
+* Add `TextShow`/`TextShow1` instances for `Fix` and `Sum` in `TextShow.Data.Bifunctor`
+* Add `TextShow`/`TextShow1` instances for the datatypes in `Text.PrettyPrint.Annotated` (introduced in @pretty-1.1.1.3@)
+* Add `TextShow` instances for the new datatypes in @template-haskell-2.11.0.0@
+
 ## 2.1
 * Reexport the `TextShow` classes and module from `TextShow.Instances`. This helps Haddock readers discover what new instances are added with `text-show-instances`.
 * Make `Tagged` instances poly-kinded
diff --git a/src/TextShow/Compiler/Hoopl.hs b/src/TextShow/Compiler/Hoopl.hs
--- a/src/TextShow/Compiler/Hoopl.hs
+++ b/src/TextShow/Compiler/Hoopl.hs
@@ -17,11 +17,11 @@
 -}
 module TextShow.Compiler.Hoopl (
       showbLabel
-    , showbLabelMapPrecWith
+    , liftShowbLabelMapPrec
     , showbLabelSetPrec
-    , showbPointedWith
+    , liftShowbPointed
     , showbUnique
-    , showbUniqueMapPrecWith
+    , liftShowbUniqueMapPrec
     , showbUniqueSetPrec
     , showbDominatorNode
     , showbDominatorTree
@@ -39,8 +39,8 @@
 
 import Data.Monoid.Compat
 
-import TextShow (TextShow(showb, showbPrec), TextShow1(..),
-                 TextShow2(..), Builder, singleton)
+import TextShow (TextShow(..), TextShow1(..),
+                 TextShow2(..), Builder, singleton, showbPrec1)
 import TextShow.Data.Containers ()
 import TextShow.Data.Integral (showbIntPrec)
 import TextShow.TH (deriveTextShow, deriveTextShow1)
@@ -56,10 +56,10 @@
 
 -- | Convert a 'LabelMap' to a 'Builder' with the given show function and precedence.
 --
--- /Since: 2/
-showbLabelMapPrecWith :: (Int -> v -> Builder) -> Int -> LabelMap v -> Builder
-showbLabelMapPrecWith = showbPrecWith
-{-# INLINE showbLabelMapPrecWith #-}
+-- /Since: 3/
+liftShowbLabelMapPrec :: (v -> Builder) -> Int -> LabelMap v -> Builder
+liftShowbLabelMapPrec sp = liftShowbPrec (const sp) undefined
+{-# INLINE liftShowbLabelMapPrec #-}
 
 -- | Convert a 'LabelSet' to a 'Builder' with the given precedence.
 --
@@ -70,12 +70,12 @@
 
 -- | Convert a 'Pointed' value to a 'Builder' with the given show function.
 --
--- /Since: 2/
-showbPointedWith :: (a -> Builder) -> Pointed t b a -> Builder
-showbPointedWith _  Bot       = "_|_"
-showbPointedWith _  Top       = singleton 'T'
-showbPointedWith sp (PElem a) = sp a
-{-# INLINE showbPointedWith #-}
+-- /Since: 3/
+liftShowbPointed :: (a -> Builder) -> Pointed t b a -> Builder
+liftShowbPointed _  Bot       = "_|_"
+liftShowbPointed _  Top       = singleton 'T'
+liftShowbPointed sp (PElem a) = sp a
+{-# INLINE liftShowbPointed #-}
 
 -- | Convert a 'Unique' value to a 'Builder'.
 --
@@ -90,10 +90,10 @@
 
 -- | Convert a 'UniqueMap' to a 'Builder' with the given show function and precedence.
 --
--- /Since: 2/
-showbUniqueMapPrecWith :: (Int -> v -> Builder) -> Int -> UniqueMap v -> Builder
-showbUniqueMapPrecWith = showbPrecWith
-{-# INLINE showbUniqueMapPrecWith #-}
+-- /Since: 3/
+liftShowbUniqueMapPrec :: (v -> Builder) -> Int -> UniqueMap v -> Builder
+liftShowbUniqueMapPrec sp = liftShowbPrec (const sp) undefined
+{-# INLINE liftShowbUniqueMapPrec #-}
 
 -- | Convert a 'UniqueSet' to a 'Builder' with the given precedence.
 --
@@ -156,16 +156,16 @@
 $(deriveTextShow  ''LabelSet)
 
 instance TextShow a => TextShow (Pointed t b a) where
-    showbPrec = showbPrecWith showbPrec
+    showbPrec = showbPrec1
     INLINE_INST_FUN(showbPrec)
 
 instance TextShow1 (Pointed t b) where
-    showbPrecWith sp _ = showbPointedWith $ sp 0
-    INLINE_INST_FUN(showbPrecWith)
+    liftShowbPrec sp _ _ = liftShowbPointed $ sp 0
+    INLINE_INST_FUN(liftShowbPrec)
 
 instance TextShow2 (Pointed t) where
-    showbPrecWith2 _ = showbPrecWith
-    INLINE_INST_FUN(showbPrecWith2)
+    liftShowbPrec2 _ _ = liftShowbPrec
+    INLINE_INST_FUN(liftShowbPrec2)
 
 #if !(MIN_VERSION_hoopl(3,9,0))
 instance TextShow Unique where
diff --git a/src/TextShow/Control/Applicative/Trans.hs b/src/TextShow/Control/Applicative/Trans.hs
--- a/src/TextShow/Control/Applicative/Trans.hs
+++ b/src/TextShow/Control/Applicative/Trans.hs
@@ -14,51 +14,51 @@
 /Since: 2/
 -}
 module TextShow.Control.Applicative.Trans (
-      showbBackwardsPrecWith
-    , showbLiftPrecWith
+      liftShowbBackwardsPrec
+    , liftShowbLiftPrec
     ) where
 
 import Control.Applicative.Backwards (Backwards(..))
 import Control.Applicative.Lift (Lift(..))
 
-import TextShow (TextShow(showbPrec), TextShow1(..),
+import TextShow (TextShow(..), TextShow1(..),
                  Builder, showbPrec1, showbUnaryWith)
 
 #include "inline.h"
 
--- | Convert a 'Backwards' value to a 'Builder' with the given show function
+-- | Convert a 'Backwards' value to a 'Builder' with the given show functions
 -- and precedence.
 --
--- /Since: 2/
-showbBackwardsPrecWith :: TextShow1 f
-                       => (Int -> a -> Builder)
+-- /Since: 3/
+liftShowbBackwardsPrec :: TextShow1 f
+                       => (Int -> a -> Builder) -> ([a] -> Builder)
                        -> Int -> Backwards f a -> Builder
-showbBackwardsPrecWith sp p (Backwards x)
-    = showbUnaryWith (showbPrecWith sp) "Backwards" p x
-{-# INLINE showbBackwardsPrecWith #-}
+liftShowbBackwardsPrec sp sl p (Backwards x)
+    = showbUnaryWith (liftShowbPrec sp sl) "Backwards" p x
+{-# INLINE liftShowbBackwardsPrec #-}
 
--- | Convert a 'Lift' value to a 'Builder' with the given show function and precedence.
+-- | Convert a 'Lift' value to a 'Builder' with the given show functions and precedence.
 --
--- /Since: 2/
-showbLiftPrecWith :: TextShow1 f
-                  => (Int -> a -> Builder)
+-- /Since: 3/
+liftShowbLiftPrec :: TextShow1 f
+                  => (Int -> a -> Builder) -> ([a] -> Builder)
                   -> Int -> Lift f a -> Builder
-showbLiftPrecWith sp p (Pure  x) = showbUnaryWith sp                 "Pure" p x
-showbLiftPrecWith sp p (Other y) = showbUnaryWith (showbPrecWith sp) "Other" p y
-{-# INLINE showbLiftPrecWith #-}
+liftShowbLiftPrec sp _  p (Pure  x) = showbUnaryWith sp                    "Pure" p x
+liftShowbLiftPrec sp sl p (Other y) = showbUnaryWith (liftShowbPrec sp sl) "Other" p y
+{-# INLINE liftShowbLiftPrec #-}
 
 instance (TextShow1 f, TextShow a) => TextShow (Backwards f a) where
     showbPrec = showbPrec1
     INLINE_INST_FUN(showbPrec)
 
 instance TextShow1 f => TextShow1 (Backwards f) where
-    showbPrecWith = showbBackwardsPrecWith
-    INLINE_INST_FUN(showbPrecWith)
+    liftShowbPrec = liftShowbBackwardsPrec
+    INLINE_INST_FUN(liftShowbPrec)
 
 instance (TextShow1 f, TextShow a) => TextShow (Lift f a) where
     showbPrec = showbPrec1
     INLINE_INST_FUN(showbPrec)
 
 instance TextShow1 f => TextShow1 (Lift f) where
-    showbPrecWith = showbLiftPrecWith
-    INLINE_INST_FUN(showbPrecWith)
+    liftShowbPrec = liftShowbLiftPrec
+    INLINE_INST_FUN(liftShowbPrec)
diff --git a/src/TextShow/Control/Monad/Trans.hs b/src/TextShow/Control/Monad/Trans.hs
--- a/src/TextShow/Control/Monad/Trans.hs
+++ b/src/TextShow/Control/Monad/Trans.hs
@@ -14,14 +14,13 @@
 /Since: 2/
 -}
 module TextShow.Control.Monad.Trans (
-      showbErrorTPrecWith
-    , showbExceptTPrecWith
-    , showbIdentityTPrecWith
-    , showbListTPrec
-    , showbListTPrecWith
-    , showbMaybeTPrecWith
-    , showbWriterTLazyPrecWith
-    , showbWriterTStrictPrecWith
+      liftShowbErrorTPrec
+    , liftShowbExceptTPrec
+    , liftShowbIdentityTPrec
+    , liftShowbListTPrec
+    , liftShowbMaybeTPrec
+    , liftShowbWriterTLazyPrec
+    , liftShowbWriterTStrictPrec
     ) where
 
 import           Control.Monad.Trans.Error               (ErrorT(..))
@@ -32,147 +31,147 @@
 import qualified Control.Monad.Trans.Writer.Lazy   as WL (WriterT(..))
 import qualified Control.Monad.Trans.Writer.Strict as WS (WriterT(..))
 
-import           TextShow (TextShow(showb, showbPrec), TextShow1(..),
+import           TextShow (TextShow(..), TextShow1(..), TextShow2(..),
                            Builder, showbPrec1, showbUnaryWith)
-import           TextShow.Data.Tuple (showb2TupleWith2)
 
 #include "inline.h"
 
--- | Convert an 'ErrorT' value to a 'Builder' with the given show function
+-- | Convert an 'ErrorT' value to a 'Builder' with the given show functions
 -- and precedence.
 --
--- /Since: 2/
-showbErrorTPrecWith :: (TextShow e, TextShow1 m)
-                    => (Int -> a -> Builder)
+-- /Since: 3/
+liftShowbErrorTPrec :: (TextShow e, TextShow1 m)
+                    => (Int -> a -> Builder) -> ([a] -> Builder)
                     -> Int -> ErrorT e m a -> Builder
-showbErrorTPrecWith sp p (ErrorT m) =
-    showbUnaryWith (showbPrecWith (showbPrecWith sp)) "ErrorT" p m
-{-# INLINE showbErrorTPrecWith #-}
+liftShowbErrorTPrec sp sl p (ErrorT m) =
+    showbUnaryWith (liftShowbPrec (liftShowbPrec sp sl)
+                                  (liftShowbList sp sl)) "ErrorT" p m
+{-# INLINE liftShowbErrorTPrec #-}
 
--- | Convert an 'ExceptT' value to a 'Builder' with the given show function
+-- | Convert an 'ExceptT' value to a 'Builder' with the given show functions
 -- and precedence.
 --
--- /Since: 2/
-showbExceptTPrecWith :: (TextShow e, TextShow1 m)
-                     => (Int -> a -> Builder)
+-- /Since: 3/
+liftShowbExceptTPrec :: (TextShow e, TextShow1 m)
+                     => (Int -> a -> Builder) -> ([a] -> Builder)
                      -> Int -> ExceptT e m a -> Builder
-showbExceptTPrecWith sp p (ExceptT m) =
-    showbUnaryWith (showbPrecWith (showbPrecWith sp)) "ExceptT" p m
-{-# INLINE showbExceptTPrecWith #-}
+liftShowbExceptTPrec sp sl p (ExceptT m) =
+    showbUnaryWith (liftShowbPrec (liftShowbPrec sp sl)
+                                  (liftShowbList sp sl)) "ExceptT" p m
+{-# INLINE liftShowbExceptTPrec #-}
 
--- | Convert an 'IdentityT' value to a 'Builder' with the given show function
+-- | Convert an 'IdentityT' value to a 'Builder' with the given show functions
 -- and precedence.
 --
--- /Since: 2/
-showbIdentityTPrecWith :: TextShow1 f
-                       => (Int -> a -> Builder)
+-- /Since: 3/
+liftShowbIdentityTPrec :: TextShow1 f
+                       => (Int -> a -> Builder) -> ([a] -> Builder)
                        -> Int -> IdentityT f a -> Builder
-showbIdentityTPrecWith sp p (IdentityT m) =
-    showbUnaryWith (showbPrecWith sp) "IdentityT" p m
-{-# INLINE showbIdentityTPrecWith #-}
-
--- | Convert a 'ListT' value to a 'Builder' with the given precedence.
---
--- /Since: 2/
-showbListTPrec :: (TextShow1 m, TextShow a) => Int -> ListT m a -> Builder
-showbListTPrec p (ListT m) = showbUnaryWith (showbPrecWith showbPrec) "ListT" p m
-{-# INLINE showbListTPrec #-}
+liftShowbIdentityTPrec sp sl p (IdentityT m) =
+    showbUnaryWith (liftShowbPrec sp sl) "IdentityT" p m
+{-# INLINE liftShowbIdentityTPrec #-}
 
--- | Convert a 'ListT' value to a 'Builder' with the given show function and precedence.
+-- | Convert a 'ListT' value to a 'Builder' with the given show functions and precedence.
 --
--- /Since: 2/
-showbListTPrecWith :: TextShow1 m
-                   => (a -> Builder)
+-- /Since: 3/
+liftShowbListTPrec :: TextShow1 m
+                   => (Int -> a -> Builder) -> ([a] -> Builder)
                    -> Int -> ListT m a -> Builder
-showbListTPrecWith sp p (ListT m) =
-    showbUnaryWith (showbPrecWith (showbPrecWith (const sp))) "ListT" p m
-{-# INLINE showbListTPrecWith #-}
+liftShowbListTPrec sp sl p (ListT m) =
+    showbUnaryWith (liftShowbPrec (liftShowbPrec sp sl)
+                                  (liftShowbList sp sl)) "ListT" p m
+{-# INLINE liftShowbListTPrec #-}
 
--- | Convert a 'MaybeT' value to a 'Builder' with the given show function
+-- | Convert a 'MaybeT' value to a 'Builder' with the given show functions
 -- and precedence.
 --
--- /Since: 2/
-showbMaybeTPrecWith :: TextShow1 m
-                    => (Int -> a -> Builder)
+-- /Since: 3/
+liftShowbMaybeTPrec :: TextShow1 m
+                    => (Int -> a -> Builder) -> ([a] -> Builder)
                     -> Int -> MaybeT m a -> Builder
-showbMaybeTPrecWith sp p (MaybeT m) =
-    showbUnaryWith (showbPrecWith (showbPrecWith sp)) "MaybeT" p m
-{-# INLINE showbMaybeTPrecWith #-}
+liftShowbMaybeTPrec sp sl p (MaybeT m) =
+    showbUnaryWith (liftShowbPrec (liftShowbPrec sp sl)
+                                  (liftShowbList sp sl)) "MaybeT" p m
+{-# INLINE liftShowbMaybeTPrec #-}
 
--- | Convert a lazy 'WL.WriterT' value to a 'Builder' with the given show function
+-- | Convert a lazy 'WL.WriterT' value to a 'Builder' with the given show functions
 -- and precedence.
 --
--- /Since: 2/
-showbWriterTLazyPrecWith :: (TextShow w, TextShow1 m)
-                         => (a -> Builder)
+-- /Since: 3/
+liftShowbWriterTLazyPrec :: (TextShow w, TextShow1 m)
+                         => (Int -> a -> Builder) -> ([a] -> Builder)
                          -> Int -> WL.WriterT w m a -> Builder
-showbWriterTLazyPrecWith sp p (WL.WriterT m) =
-    showbUnaryWith (showbPrecWith (const $ showb2TupleWith2 sp showb)) "WriterT" p m
-{-# INLINE showbWriterTLazyPrecWith #-}
+liftShowbWriterTLazyPrec sp sl p (WL.WriterT m) =
+    showbUnaryWith (liftShowbPrec (liftShowbPrec2 sp sl showbPrec showbList)
+                                  (liftShowbList2 sp sl showbPrec showbList))
+                   "WriterT" p m
+{-# INLINE liftShowbWriterTLazyPrec #-}
 
--- | Convert a strict 'WS.WriterT' value to a 'Builder' with the given show function
+-- | Convert a strict 'WS.WriterT' value to a 'Builder' with the given show functions
 -- and precedence.
 --
--- /Since: 2/
-showbWriterTStrictPrecWith :: (TextShow w, TextShow1 m)
-                           => (a -> Builder)
+-- /Since: 3/
+liftShowbWriterTStrictPrec :: (TextShow w, TextShow1 m)
+                           => (Int -> a -> Builder) -> ([a] -> Builder)
                            -> Int -> WS.WriterT w m a -> Builder
-showbWriterTStrictPrecWith sp p (WS.WriterT m) =
-    showbUnaryWith (showbPrecWith (const $ showb2TupleWith2 sp showb)) "WriterT" p m
-{-# INLINE showbWriterTStrictPrecWith #-}
+liftShowbWriterTStrictPrec sp sl p (WS.WriterT m) =
+    showbUnaryWith (liftShowbPrec (liftShowbPrec2 sp sl showbPrec showbList)
+                                  (liftShowbList2 sp sl showbPrec showbList))
+                   "WriterT" p m
+{-# INLINE liftShowbWriterTStrictPrec #-}
 
 instance (TextShow e, TextShow1 m, TextShow a) => TextShow (ErrorT e m a) where
     showbPrec = showbPrec1
     INLINE_INST_FUN(showbPrec)
 
 instance (TextShow e, TextShow1 m) => TextShow1 (ErrorT e m) where
-    showbPrecWith = showbErrorTPrecWith
-    INLINE_INST_FUN(showbPrecWith)
+    liftShowbPrec = liftShowbErrorTPrec
+    INLINE_INST_FUN(liftShowbPrec)
 
 instance (TextShow e, TextShow1 m, TextShow a) => TextShow (ExceptT e m a) where
     showbPrec = showbPrec1
     INLINE_INST_FUN(showbPrec)
 
 instance (TextShow e, TextShow1 m) => TextShow1 (ExceptT e m) where
-    showbPrecWith = showbExceptTPrecWith
-    INLINE_INST_FUN(showbPrecWith)
+    liftShowbPrec = liftShowbExceptTPrec
+    INLINE_INST_FUN(liftShowbPrec)
 
 instance (TextShow1 f, TextShow a) => TextShow (IdentityT f a) where
     showbPrec = showbPrec1
     INLINE_INST_FUN(showbPrec)
 
 instance TextShow1 f => TextShow1 (IdentityT f) where
-    showbPrecWith = showbIdentityTPrecWith
-    INLINE_INST_FUN(showbPrecWith)
+    liftShowbPrec = liftShowbIdentityTPrec
+    INLINE_INST_FUN(liftShowbPrec)
 
 instance (TextShow1 m, TextShow a) => TextShow (ListT m a) where
-    showbPrec = showbListTPrec
+    showbPrec = showbPrec1
     INLINE_INST_FUN(showbPrec)
 
 instance TextShow1 m => TextShow1 (ListT m) where
-    showbPrecWith sp = showbListTPrecWith $ sp 0
-    INLINE_INST_FUN(showbPrecWith)
+    liftShowbPrec = liftShowbListTPrec
+    INLINE_INST_FUN(liftShowbPrec)
 
 instance (TextShow1 m, TextShow a) => TextShow (MaybeT m a) where
     showbPrec = showbPrec1
     INLINE_INST_FUN(showbPrec)
 
 instance TextShow1 m => TextShow1 (MaybeT m) where
-    showbPrecWith = showbMaybeTPrecWith
-    INLINE_INST_FUN(showbPrecWith)
+    liftShowbPrec = liftShowbMaybeTPrec
+    INLINE_INST_FUN(liftShowbPrec)
 
 instance (TextShow w, TextShow1 m, TextShow a) => TextShow (WL.WriterT w m a) where
     showbPrec = showbPrec1
     INLINE_INST_FUN(showbPrec)
 
 instance (TextShow w, TextShow1 m) => TextShow1 (WL.WriterT w m) where
-    showbPrecWith sp = showbWriterTLazyPrecWith $ sp 0
-    INLINE_INST_FUN(showbPrecWith)
+    liftShowbPrec = liftShowbWriterTLazyPrec
+    INLINE_INST_FUN(liftShowbPrec)
 
 instance (TextShow w, TextShow1 m, TextShow a) => TextShow (WS.WriterT w m a) where
     showbPrec = showbPrec1
     INLINE_INST_FUN(showbPrec)
 
 instance (TextShow w, TextShow1 m) => TextShow1 (WS.WriterT w m) where
-    showbPrecWith sp = showbWriterTStrictPrecWith $ sp 0
-    INLINE_INST_FUN(showbPrecWith)
+    liftShowbPrec = liftShowbWriterTStrictPrec
+    INLINE_INST_FUN(liftShowbPrec)
diff --git a/src/TextShow/Data/Bifunctor.hs b/src/TextShow/Data/Bifunctor.hs
--- a/src/TextShow/Data/Bifunctor.hs
+++ b/src/TextShow/Data/Bifunctor.hs
@@ -17,34 +17,40 @@
 -}
 module TextShow.Data.Bifunctor (
       showbBiffPrec
-    , showbBiffPrecWith2
+    , liftShowbBiffPrec2
     , showbClownPrec
-    , showbClownPrecWith
+    , liftShowbClownPrec
+    , showbFixPrec
+    , liftShowbFixPrec
     , showbFlipPrec
-    , showbFlipPrecWith2
+    , liftShowbFlipPrec2
     , showbJoinPrec
-    , showbJoinPrecWith
+    , liftShowbJoinPrec
     , showbJokerPrec
-    , showbJokerPrecWith
+    , liftShowbJokerPrec
     , showbProductPrec
-    , showbProductPrecWith2
+    , liftShowbProductPrec2
+    , showbSumPrec
+    , liftShowbSumPrec2
     , showbTannenPrec
-    , showbTannenPrecWith2
+    , liftShowbTannenPrec2
     , showbWrappedBifunctorPrec
-    , showbWrappedBifunctorPrecWith2
+    , liftShowbWrappedBifunctorPrec2
     ) where
 
 import Data.Bifunctor.Biff (Biff)
 import Data.Bifunctor.Clown (Clown)
+import Data.Bifunctor.Fix (Fix(..))
 import Data.Bifunctor.Flip (Flip)
 import Data.Bifunctor.Join (Join(..))
 import Data.Bifunctor.Joker (Joker)
 import Data.Bifunctor.Product (Product)
+import Data.Bifunctor.Sum (Sum)
 import Data.Bifunctor.Tannen (Tannen)
 import Data.Bifunctor.Wrapped (WrappedBifunctor)
 
 import TextShow (TextShow(..), TextShow1(..), TextShow2(..), Builder)
-import TextShow.TH (deriveTextShow1, deriveTextShow2, makeShowbPrec, makeShowbPrecWith)
+import TextShow.TH (deriveTextShow2, makeShowbPrec, makeLiftShowbPrec)
 
 -- | Convert a 'Biff' value to a 'Builder' with the given precedence.
 --
@@ -55,12 +61,13 @@
 
 -- | Convert a 'Biff' value to a 'Builder' with the given show functions and precedence.
 --
--- /Since: 2/
-showbBiffPrecWith2 :: (TextShow2 p, TextShow1 f, TextShow1 g)
-                   => (Int -> a -> Builder) -> (Int -> b -> Builder)
+-- /Since: 3/
+liftShowbBiffPrec2 :: (TextShow2 p, TextShow1 f, TextShow1 g)
+                   => (Int -> a -> Builder) -> ([a] -> Builder)
+                   -> (Int -> b -> Builder) -> ([b] -> Builder)
                    -> Int -> Biff p f g a b -> Builder
-showbBiffPrecWith2 = showbPrecWith2
-{-# INLINE showbBiffPrecWith2 #-}
+liftShowbBiffPrec2 = liftShowbPrec2
+{-# INLINE liftShowbBiffPrec2 #-}
 
 -- | Convert a 'Clown' value to a 'Builder' with the given precedence.
 --
@@ -69,13 +76,30 @@
 showbClownPrec = showbPrec
 {-# INLINE showbClownPrec #-}
 
--- | Convert a 'Clown' value to a 'Builder' with the given show function and precedence.
+-- | Convert a 'Clown' value to a 'Builder' with the given show functions and precedence.
 --
--- /Since: 2/
-showbClownPrecWith :: TextShow1 f => (Int -> a -> Builder) -> Int -> Clown f a b -> Builder
-showbClownPrecWith sp = showbPrecWith2 sp undefined
-{-# INLINE showbClownPrecWith #-}
+-- /Since: 3/
+liftShowbClownPrec :: TextShow1 f => (Int -> a -> Builder) -> ([a] -> Builder)
+                   -> Int -> Clown f a b -> Builder
+liftShowbClownPrec sp sl = liftShowbPrec2 sp sl undefined undefined
+{-# INLINE liftShowbClownPrec #-}
 
+-- | Convert a 'Fix' value to a 'Builder' with the given precedence.
+--
+-- /Since: 3/
+showbFixPrec :: TextShow (p (Fix p a) a) => Int -> Fix p a -> Builder
+showbFixPrec = showbPrec
+{-# INLINE showbFixPrec #-}
+
+-- | Convert a 'Fix' value to a 'Builder' with the given show functions and precedence.
+--
+-- /Since: 3/
+liftShowbFixPrec :: TextShow2 p => (Int -> a -> Builder) -> ([a] -> Builder)
+                 -> Int -> Fix p a -> Builder
+liftShowbFixPrec sp sl p =
+    liftShowbPrec2 (liftShowbPrec sp sl) (liftShowbList sp sl) sp sl p . out
+{-# INLINE liftShowbFixPrec #-}
+
 -- | Convert a 'Flip' value to a 'Builder' with the given precedence.
 --
 -- /Since: 2/
@@ -85,12 +109,13 @@
 
 -- | Convert a 'Flip' value to a 'Builder' with the given show functions and precedence.
 --
--- /Since: 2/
-showbFlipPrecWith2 :: TextShow2 p
-                   => (Int -> a -> Builder) -> (Int -> b -> Builder)
+-- /Since: 3/
+liftShowbFlipPrec2 :: TextShow2 p
+                   => (Int -> a -> Builder) -> ([a] -> Builder)
+                   -> (Int -> b -> Builder) -> ([b] -> Builder)
                    -> Int -> Flip p a b -> Builder
-showbFlipPrecWith2 = showbPrecWith2
-{-# INLINE showbFlipPrecWith2 #-}
+liftShowbFlipPrec2 = liftShowbPrec2
+{-# INLINE liftShowbFlipPrec2 #-}
 
 -- | Convert a 'Join' value to a 'Builder' with the given precedence.
 --
@@ -99,12 +124,13 @@
 showbJoinPrec = showbPrec
 {-# INLINE showbJoinPrec #-}
 
--- | Convert a 'Join' value to a 'Builder' with the given show function and precedence.
+-- | Convert a 'Join' value to a 'Builder' with the given show functions and precedence.
 --
--- /Since: 2/
-showbJoinPrecWith :: TextShow2 p => (Int -> a -> Builder) -> Int -> Join p a -> Builder
-showbJoinPrecWith sp p = showbPrecWith2 sp sp p . runJoin
-{-# INLINE showbJoinPrecWith #-}
+-- /Since: 3/
+liftShowbJoinPrec :: TextShow2 p => (Int -> a -> Builder) -> ([a] -> Builder)
+                  -> Int -> Join p a -> Builder
+liftShowbJoinPrec sp sl p = liftShowbPrec2 sp sl sp sl p . runJoin
+{-# INLINE liftShowbJoinPrec #-}
 
 -- | Convert a 'Joker' value to a 'Builder' with the given precedence.
 --
@@ -113,30 +139,52 @@
 showbJokerPrec = showbPrec
 {-# INLINE showbJokerPrec #-}
 
--- | Convert a 'Joker' value to a 'Builder' with the given show function and precedence.
+-- | Convert a 'Joker' value to a 'Builder' with the given show functions and precedence.
 --
--- /Since: 2/
-showbJokerPrecWith :: TextShow1 g => (Int -> b -> Builder) -> Int -> Joker g a b -> Builder
-showbJokerPrecWith sp = showbPrecWith2 undefined sp
-{-# INLINE showbJokerPrecWith #-}
+-- /Since: 3/
+liftShowbJokerPrec :: TextShow1 g => (Int -> b -> Builder) -> ([b] -> Builder)
+                   -> Int -> Joker g a b -> Builder
+liftShowbJokerPrec = liftShowbPrec2 undefined undefined
+{-# INLINE liftShowbJokerPrec #-}
 
 -- | Convert a 'Product' value to a 'Builder' with the given precedence.
 --
 -- /Since: 2/
-showbProductPrec :: (TextShow (f a b), TextShow (g a b)) => Int -> Product f g a b -> Builder
+showbProductPrec :: (TextShow (f a b), TextShow (g a b))
+                 => Int -> Product f g a b -> Builder
 showbProductPrec = showbPrec
 {-# INLINE showbProductPrec #-}
 
 -- | Convert a 'Product' value to a 'Builder' with the given show functions
 -- and precedence.
 --
--- /Since: 2/
-showbProductPrecWith2 :: (TextShow2 f, TextShow2 g)
-                      => (Int -> a -> Builder) -> (Int -> b -> Builder)
+-- /Since: 3/
+liftShowbProductPrec2 :: (TextShow2 f, TextShow2 g)
+                      => (Int -> a -> Builder) -> ([a] -> Builder)
+                      -> (Int -> b -> Builder) -> ([b] -> Builder)
                       -> Int -> Product f g a b -> Builder
-showbProductPrecWith2 = showbPrecWith2
-{-# INLINE showbProductPrecWith2 #-}
+liftShowbProductPrec2 = liftShowbPrec2
+{-# INLINE liftShowbProductPrec2 #-}
 
+-- | Convert a 'Sum' value to a 'Builder' with the given precedence.
+--
+-- /Since: 3/
+showbSumPrec :: (TextShow (f a b), TextShow (g a b))
+             => Int -> Sum f g a b -> Builder
+showbSumPrec = showbPrec
+{-# INLINE showbSumPrec #-}
+
+-- | Convert a 'Sum' value to a 'Builder' with the given show functions
+-- and precedence.
+--
+-- /Since: 3/
+liftShowbSumPrec2 :: (TextShow2 f, TextShow2 g)
+                  => (Int -> a -> Builder) -> ([a] -> Builder)
+                  -> (Int -> b -> Builder) -> ([b] -> Builder)
+                  -> Int -> Sum f g a b -> Builder
+liftShowbSumPrec2 = liftShowbPrec2
+{-# INLINE liftShowbSumPrec2 #-}
+
 -- | Convert a 'Tannen' value to a 'Builder' with the given precedence.
 --
 -- /Since: 2/
@@ -147,12 +195,13 @@
 -- | Convert a 'Tannen' value to a 'Builder' with the given show functions
 -- and precedence.
 --
--- /Since: 2/
-showbTannenPrecWith2 :: (TextShow1 f, TextShow2 p)
-                     => (Int -> a -> Builder) -> (Int -> b -> Builder)
+-- /Since: 3/
+liftShowbTannenPrec2 :: (TextShow1 f, TextShow2 p)
+                     => (Int -> a -> Builder) -> ([a] -> Builder)
+                     -> (Int -> b -> Builder) -> ([b] -> Builder)
                      -> Int -> Tannen f p a b -> Builder
-showbTannenPrecWith2 = showbPrecWith2
-{-# INLINE showbTannenPrecWith2 #-}
+liftShowbTannenPrec2 = liftShowbPrec2
+{-# INLINE liftShowbTannenPrec2 #-}
 
 -- | Convert a 'WrappedBifunctor' value to a 'Builder' with the given precedence.
 --
@@ -164,55 +213,68 @@
 -- | Convert a 'WrappedBifunctor' value to a 'Builder' with the given show functions
 -- and precedence.
 --
--- /Since: 2/
-showbWrappedBifunctorPrecWith2 :: TextShow2 p
-                               => (Int -> a -> Builder) -> (Int -> b -> Builder)
+-- /Since: 3/
+liftShowbWrappedBifunctorPrec2 :: TextShow2 p
+                               => (Int -> a -> Builder) -> ([a] -> Builder)
+                               -> (Int -> b -> Builder) -> ([b] -> Builder)
                                -> Int -> WrappedBifunctor p a b -> Builder
-showbWrappedBifunctorPrecWith2 = showbPrecWith2
-{-# INLINE showbWrappedBifunctorPrecWith2 #-}
+liftShowbWrappedBifunctorPrec2 = liftShowbPrec2
+{-# INLINE liftShowbWrappedBifunctorPrec2 #-}
 
 instance TextShow (p (f a) (g b)) => TextShow (Biff p f g a b) where
     showbPrec = $(makeShowbPrec ''Biff)
 instance (TextShow2 p, TextShow1 f, TextShow1 g, TextShow a) => TextShow1 (Biff p f g a) where
-    showbPrecWith = showbPrecWith2 showbPrec
+    liftShowbPrec = liftShowbPrec2 showbPrec showbList
 $(deriveTextShow2 ''Biff)
 
 instance TextShow (f a) => TextShow (Clown f a b) where
     showbPrec = $(makeShowbPrec ''Clown)
-$(deriveTextShow1 ''Clown)
+instance (TextShow1 f, TextShow a) => TextShow1 (Clown f a) where
+    liftShowbPrec = $(makeLiftShowbPrec ''Clown)
 $(deriveTextShow2 ''Clown)
 
+instance TextShow (p (Fix p a) a) => TextShow (Fix p a) where
+    showbPrec = $(makeShowbPrec ''Fix)
+instance TextShow2 p => TextShow1 (Fix p) where
+    liftShowbPrec = liftShowbFixPrec
+
 instance TextShow (p b a) => TextShow (Flip p a b) where
     showbPrec = $(makeShowbPrec ''Flip)
 instance (TextShow2 p, TextShow a) => TextShow1 (Flip p a) where
-    showbPrecWith = showbPrecWith2 showbPrec
+    liftShowbPrec = liftShowbPrec2 showbPrec showbList
 $(deriveTextShow2 ''Flip)
 
 instance TextShow (p a a) => TextShow (Join p a) where
     showbPrec = $(makeShowbPrec ''Join)
 instance TextShow2 p => TextShow1 (Join p) where
-    showbPrecWith = showbJoinPrecWith
+    liftShowbPrec = liftShowbJoinPrec
 
 instance TextShow (g b) => TextShow (Joker g a b) where
     showbPrec = $(makeShowbPrec ''Joker)
 instance TextShow1 g => TextShow1 (Joker g a) where
-    showbPrecWith = $(makeShowbPrecWith ''Joker)
+    liftShowbPrec = $(makeLiftShowbPrec ''Joker)
 $(deriveTextShow2 ''Joker)
 
 instance (TextShow (f a b), TextShow (g a b)) => TextShow (Product f g a b) where
     showbPrec = $(makeShowbPrec ''Product)
 instance (TextShow2 f, TextShow2 g, TextShow a) => TextShow1 (Product f g a) where
-    showbPrecWith = showbPrecWith2 showbPrec
+    liftShowbPrec = liftShowbPrec2 showbPrec showbList
 $(deriveTextShow2 ''Product)
 
+instance (TextShow (f a b), TextShow (g a b)) => TextShow (Sum f g a b) where
+    showbPrec = $(makeShowbPrec ''Sum)
+instance (TextShow2 f, TextShow2 g, TextShow a) => TextShow1 (Sum f g a) where
+    liftShowbPrec = liftShowbPrec2 showbPrec showbList
+$(deriveTextShow2 ''Sum)
+
 instance TextShow (f (p a b)) => TextShow (Tannen f p a b) where
     showbPrec = $(makeShowbPrec ''Tannen)
 instance (TextShow1 f, TextShow2 p, TextShow a) => TextShow1 (Tannen f p a) where
-    showbPrecWith = showbPrecWith2 showbPrec
+    liftShowbPrec = liftShowbPrec2 showbPrec showbList
 $(deriveTextShow2 ''Tannen)
 
 instance TextShow (p a b) => TextShow (WrappedBifunctor p a b) where
     showbPrec = $(makeShowbPrec ''WrappedBifunctor)
 instance (TextShow2 p, TextShow a) => TextShow1 (WrappedBifunctor p a) where
-    showbPrecWith = showbPrecWith2 showbPrec
+    liftShowbPrec = liftShowbPrec2 showbPrec showbList
 $(deriveTextShow2 ''WrappedBifunctor)
diff --git a/src/TextShow/Data/Binary.hs b/src/TextShow/Data/Binary.hs
--- a/src/TextShow/Data/Binary.hs
+++ b/src/TextShow/Data/Binary.hs
@@ -14,7 +14,7 @@
 
 /Since: 2/
 -}
-module TextShow.Data.Binary (showbDecoderWith) where
+module TextShow.Data.Binary (liftShowbDecoder) where
 
 import Data.Binary.Get.Internal (Decoder(..))
 import Data.Monoid.Compat
@@ -25,17 +25,17 @@
 
 -- | Convert a 'Decoder' to a 'Builder' with the given show function.
 --
--- /Since: 2/
-showbDecoderWith :: (a -> Builder) -> Decoder a -> Builder
-showbDecoderWith _  (Fail _ msg)    = "Fail: " <> fromString msg
-showbDecoderWith _  (Partial _)     = "Partial _"
-showbDecoderWith sp (Done _ a)      = "Done: " <> sp a
-showbDecoderWith _  (BytesRead _ _) = "BytesRead"
+-- /Since: 3/
+liftShowbDecoder :: (a -> Builder) -> Decoder a -> Builder
+liftShowbDecoder _  (Fail _ msg)    = "Fail: " <> fromString msg
+liftShowbDecoder _  (Partial _)     = "Partial _"
+liftShowbDecoder sp (Done _ a)      = "Done: " <> sp a
+liftShowbDecoder _  (BytesRead _ _) = "BytesRead"
 
 instance TextShow a => TextShow (Decoder a) where
     showbPrec = showbPrec1
     INLINE_INST_FUN(showbPrec)
 
 instance TextShow1 Decoder where
-    showbPrecWith sp _ = showbDecoderWith $ sp 0
-    INLINE_INST_FUN(showbPrecWith)
+    liftShowbPrec sp _ _ = liftShowbDecoder $ sp 0
+    INLINE_INST_FUN(liftShowbPrec)
diff --git a/src/TextShow/Data/Containers.hs b/src/TextShow/Data/Containers.hs
--- a/src/TextShow/Data/Containers.hs
+++ b/src/TextShow/Data/Containers.hs
@@ -14,19 +14,14 @@
 /Since: 2/
 -}
 module TextShow.Data.Containers (
-      showbIntMapPrecWith
+      liftShowbIntMapPrec
     , showbIntSetPrec
-    , showbMapPrecWith2
-    , showbSequencePrec
-    , showbSequencePrecWith
-    , showbViewLPrec
-    , showbViewLPrecWith
-    , showbViewRPrec
-    , showbViewRPrecWith
-    , showbSetPrec
-    , showbSetPrecWith
-    , showbTreePrec
-    , showbTreePrecWith
+    , liftShowbMapPrec2
+    , liftShowbSequencePrec
+    , liftShowbViewLPrec
+    , liftShowbViewRPrec
+    , liftShowbSetPrec
+    , liftShowbTreePrec
     ) where
 
 import qualified Data.Foldable as F
@@ -42,113 +37,84 @@
 import           Data.Set (Set)
 import           Data.Tree (Tree)
 
-import           TextShow (TextShow(showb, showbPrec), TextShow1(..), TextShow2(..),
+import           TextShow (TextShow(..), TextShow1(..), TextShow2(..),
                            Builder, showbPrec1)
 import           TextShow.Data.Integral ()
-import           TextShow.Data.Tuple (showb2TupleWith2)
 import           TextShow.TH (deriveTextShow, deriveTextShow1)
-import           TextShow.Utils (showbUnaryList, showbUnaryListWith)
+import           TextShow.Utils (showbUnaryListWith)
 
 #include "inline.h"
 
 -- | Convert an 'IntMap' to a 'Builder' with the given show function and precedence.
 --
--- /Since: 2/
-showbIntMapPrecWith :: (v -> Builder) -> Int -> IntMap v -> Builder
-showbIntMapPrecWith sp p = showbUnaryListWith (showb2TupleWith2 showb sp) p . IM.toList
-{-# INLINE showbIntMapPrecWith #-}
+-- /Since: 3/
+liftShowbIntMapPrec :: (v -> Builder) -> Int -> IntMap v -> Builder
+liftShowbIntMapPrec sp p =
+    showbUnaryListWith (liftShowbList2 showbPrec undefined
+                                      (const sp) undefined) p . IM.toList
+{-# INLINE liftShowbIntMapPrec #-}
 
 -- | Convert an 'IntSet' to a 'Builder' with the given precedence.
 --
 -- /Since: 2/
 showbIntSetPrec :: Int -> IntSet -> Builder
-showbIntSetPrec p = showbUnaryListWith showb p . IS.toList
+showbIntSetPrec p = showbUnaryListWith showbList p . IS.toList
 {-# INLINE showbIntSetPrec #-}
 
 -- | Convert a 'Map' to a 'Builder' with the given show functions and precedence.
 --
--- /Since: 2/
-showbMapPrecWith2 :: (k -> Builder) -> (v -> Builder) -> Int -> Map k v -> Builder
-showbMapPrecWith2 sp1 sp2 p = showbUnaryListWith (showb2TupleWith2 sp1 sp2) p . M.toList
-{-# INLINE showbMapPrecWith2 #-}
-
--- | Convert a 'Sequence' to a 'Builder' with the given precedence.
---
--- /Since: 2/
-showbSequencePrec :: TextShow a => Int -> Seq a -> Builder
-showbSequencePrec p = showbUnaryList p . F.toList
-{-# INLINE showbSequencePrec #-}
+-- /Since: 3/
+liftShowbMapPrec2 :: (k -> Builder) -> (v -> Builder) -> Int -> Map k v -> Builder
+liftShowbMapPrec2 sp1 sp2 p =
+    showbUnaryListWith (liftShowbList2 (const sp1) undefined
+                                       (const sp2) undefined) p . M.toList
+{-# INLINE liftShowbMapPrec2 #-}
 
 -- | Convert a 'Sequence' to a 'Builder' with the given show function and precedence.
 --
--- /Since: 2/
-showbSequencePrecWith :: (a -> Builder) -> Int -> Seq a -> Builder
-showbSequencePrecWith sp p = showbUnaryListWith sp p . F.toList
-{-# INLINE showbSequencePrecWith #-}
-
--- | Convert a 'ViewL' value to a 'Builder' with the given precedence.
---
--- /Since: 2/
-showbViewLPrec :: TextShow a => Int -> ViewL a -> Builder
-showbViewLPrec = showbPrec
-{-# INLINE showbViewLPrec #-}
+-- /Since: 3/
+liftShowbSequencePrec :: ([a] -> Builder) -> Int -> Seq a -> Builder
+liftShowbSequencePrec sl p = showbUnaryListWith sl p . F.toList
+{-# INLINE liftShowbSequencePrec #-}
 
 -- | Convert a 'ViewL' value to a 'Builder' with the given show function and precedence.
 --
--- /Since: 2/
-showbViewLPrecWith :: (a -> Builder) -> Int -> ViewL a -> Builder
-showbViewLPrecWith sp = showbPrecWith $ const sp
-{-# INLINE showbViewLPrecWith #-}
-
--- | Convert a 'ViewR' value to a 'Builder' with the given precedence.
---
--- /Since: 2/
-showbViewRPrec :: TextShow a => Int -> ViewR a -> Builder
-showbViewRPrec = showbPrec
-{-# INLINE showbViewRPrec #-}
+-- /Since: 3/
+liftShowbViewLPrec :: (Int -> a -> Builder) -> ([a] -> Builder)
+                   -> Int -> ViewL a -> Builder
+liftShowbViewLPrec = liftShowbPrec
+{-# INLINE liftShowbViewLPrec #-}
 
 -- | Convert a 'ViewR' value to a 'Builder' with the given show function and precedence.
 --
--- /Since: 2/
-showbViewRPrecWith :: (a -> Builder) -> Int -> ViewR a -> Builder
-showbViewRPrecWith sp = showbPrecWith $ const sp
-{-# INLINE showbViewRPrecWith #-}
-
--- | Convert a 'Set' to a 'Builder' with the given precedence.
---
--- /Since: 2/
-showbSetPrec :: TextShow a => Int -> Set a -> Builder
-showbSetPrec p = showbUnaryList p . Set.toList
-{-# INLINE showbSetPrec #-}
+-- /Since: 3/
+liftShowbViewRPrec :: (Int -> a -> Builder) -> ([a] -> Builder)
+                   -> Int -> ViewR a -> Builder
+liftShowbViewRPrec = liftShowbPrec
+{-# INLINE liftShowbViewRPrec #-}
 
 -- | Convert a 'Set' to a 'Builder' with the given show function and precedence.
 --
--- /Since: 2/
-showbSetPrecWith :: (a -> Builder) -> Int -> Set a -> Builder
-showbSetPrecWith sp p = showbUnaryListWith sp p . Set.toList
-{-# INLINE showbSetPrecWith #-}
-
--- | Convert a 'Tree' to a 'Builder' with the given precedence.
---
--- /Since: 2/
-showbTreePrec :: TextShow a => Int -> Tree a -> Builder
-showbTreePrec = showbPrec
-{-# INLINE showbTreePrec #-}
+-- /Since: 3/
+liftShowbSetPrec :: ([a] -> Builder) -> Int -> Set a -> Builder
+liftShowbSetPrec sl p = showbUnaryListWith sl p . Set.toList
+{-# INLINE liftShowbSetPrec #-}
 
--- | Convert a 'Tree' to a 'Builder' with the given show function and precedence.
+-- | Convert a 'Tree' to a 'Builder' with the given show functions and precedence.
 --
--- /Since: 2/
-showbTreePrecWith :: (a -> Builder) -> Int -> Tree a -> Builder
-showbTreePrecWith sp = showbPrecWith $ const sp
-{-# INLINE showbTreePrecWith #-}
+-- /Since: 3/
+liftShowbTreePrec :: (Int -> a -> Builder) -> ([a] -> Builder)
+                  -> Int -> Tree a -> Builder
+liftShowbTreePrec = liftShowbPrec
+{-# INLINE liftShowbTreePrec #-}
 
 instance TextShow v => TextShow (IntMap v) where
     showbPrec = showbPrec1
     INLINE_INST_FUN(showbPrec)
 
 instance TextShow1 IntMap where
-    showbPrecWith sp = showbIntMapPrecWith $ sp 0
-    INLINE_INST_FUN(showbPrecWith)
+    liftShowbPrec sp _ = liftShowbIntMapPrec (sp 0)
+    INLINE_INST_FUN(liftShowbPrec)
 
 instance TextShow IntSet where
     showbPrec = showbIntSetPrec
@@ -159,20 +125,20 @@
     INLINE_INST_FUN(showbPrec)
 
 instance TextShow k => TextShow1 (Map k) where
-    showbPrecWith = showbPrecWith2 showbPrec
-    INLINE_INST_FUN(showbPrecWith)
+    liftShowbPrec = liftShowbPrec2 showbPrec showbList
+    INLINE_INST_FUN(liftShowbPrec)
 
 instance TextShow2 Map where
-    showbPrecWith2 sp1 sp2 = showbMapPrecWith2 (sp1 0) (sp2 0)
-    INLINE_INST_FUN(showbPrecWith2)
+    liftShowbPrec2 sp1 _ sp2 _ = liftShowbMapPrec2 (sp1 0) (sp2 0)
+    INLINE_INST_FUN(liftShowbPrec2)
 
 instance TextShow a => TextShow (Seq a) where
-    showbPrec = showbSequencePrec
+    showbPrec = showbPrec1
     INLINE_INST_FUN(showbPrec)
 
 instance TextShow1 Seq where
-    showbPrecWith sp = showbSequencePrecWith $ sp 0
-    INLINE_INST_FUN(showbPrecWith)
+    liftShowbPrec _ = liftShowbSequencePrec
+    INLINE_INST_FUN(liftShowbPrec)
 
 $(deriveTextShow  ''ViewL)
 $(deriveTextShow1 ''ViewL)
@@ -181,12 +147,12 @@
 $(deriveTextShow1 ''ViewR)
 
 instance TextShow a => TextShow (Set a) where
-    showbPrec = showbSetPrec
+    showbPrec = showbPrec1
     INLINE_INST_FUN(showbPrec)
 
 instance TextShow1 Set where
-    showbPrecWith sp = showbSetPrecWith $ sp 0
-    INLINE_INST_FUN(showbPrecWith)
+    liftShowbPrec _ = liftShowbSetPrec
+    INLINE_INST_FUN(liftShowbPrec)
 
 $(deriveTextShow  ''Tree)
 $(deriveTextShow1 ''Tree)
diff --git a/src/TextShow/Data/Functor/Trans.hs b/src/TextShow/Data/Functor/Trans.hs
--- a/src/TextShow/Data/Functor/Trans.hs
+++ b/src/TextShow/Data/Functor/Trans.hs
@@ -14,121 +14,63 @@
 Stability:   Provisional
 Portability: GHC
 
-Monomorphic 'TextShow' functions for functor transformers. Note that an instance for
-the 'Identity' transformer is found in @text-show@, since it is a part of
-@base-4.8.0.0@ and later.
+Monomorphic 'TextShow' functions for functor transformers.
 
+Note that :
+
+* An instance for 'Identity' is found in @text-show@, since it is a part of
+  @base-4.8.0.0@ and later.
+
+* Instances for 'Compose', 'Product', and 'Sum' are found in @text-show@, since they
+  are part of @base-4.9.0.0@ and later.
+
 /Since: 2/
 -}
-module TextShow.Data.Functor.Trans (
-      showbComposePrecWith
-    , showbConstantPrecWith
-    , showbProductPrecWith
-    , showbReversePrecWith
-    , showbSumPrecWith
-    ) where
+module TextShow.Data.Functor.Trans (liftShowbConstantPrec, liftShowbReversePrec) where
 
-import Data.Functor.Compose  (Compose(..))
 import Data.Functor.Constant (Constant(..))
-import Data.Functor.Product  (Product(..))
 import Data.Functor.Reverse  (Reverse(..))
-import Data.Functor.Sum      (Sum(..))
 
-import TextShow (TextShow(showbPrec), TextShow1(..), TextShow2(..),
-                 Builder, showbPrec1, showbUnaryWith, showbBinaryWith)
+import TextShow (TextShow(..), TextShow1(..), TextShow2(..),
+                 Builder, showbPrec1, showbUnaryWith)
 
 #include "inline.h"
 
--- | Convert a 'Compose' value to a 'Builder' with the given show function
--- and precedence.
---
--- /Since: 2/
-showbComposePrecWith :: (TextShow1 f, TextShow1 g)
-                     => (Int -> a -> Builder)
-                     -> Int -> Compose f g a -> Builder
-showbComposePrecWith sp p (Compose x) =
-    showbUnaryWith (showbPrecWith (showbPrecWith sp)) "Compose" p x
-{-# INLINE showbComposePrecWith #-}
-
 -- | Convert a 'Constant' value to a 'Builder' with the given show function
 -- and precedence.
 --
--- /Since: 2/
-showbConstantPrecWith :: (Int -> a -> Builder) -> Int -> Constant a b -> Builder
-showbConstantPrecWith sp p (Constant x) = showbUnaryWith sp "Constant" p x
-{-# INLINE showbConstantPrecWith #-}
-
--- | Convert a 'Product' value to a 'Builder' with the given show function
--- and precedence.
---
--- /Since: 2/
-showbProductPrecWith :: (TextShow1 f, TextShow1 g)
-                     => (Int -> a -> Builder)
-                     -> Int -> Product f g a -> Builder
-showbProductPrecWith sp p (Pair x y) =
-    showbBinaryWith (showbPrecWith sp) (showbPrecWith sp) "Pair" p x y
-{-# INLINE showbProductPrecWith #-}
+-- /Since: 3/
+liftShowbConstantPrec :: (Int -> a -> Builder) -> Int -> Constant a b -> Builder
+liftShowbConstantPrec sp p (Constant x) = showbUnaryWith sp "Constant" p x
+{-# INLINE liftShowbConstantPrec #-}
 
--- | Convert a 'Reverse' value to a 'Builder' with the given show function
+-- | Convert a 'Reverse' value to a 'Builder' with the given show functions
 -- and precedence.
 --
--- /Since: 2/
-showbReversePrecWith :: TextShow1 f
-                     => (Int -> a -> Builder)
+-- /Since: 3/
+liftShowbReversePrec :: TextShow1 f
+                     => (Int -> a -> Builder) -> ([a] -> Builder)
                      -> Int -> Reverse f a -> Builder
-showbReversePrecWith sp p (Reverse x) = showbUnaryWith (showbPrecWith sp) "Reverse" p x
-{-# INLINE showbReversePrecWith #-}
-
--- | Convert a 'Sum' value to a 'Builder' with the given show function and precedence.
---
--- /Since: 2/
-showbSumPrecWith :: (TextShow1 f, TextShow1 g)
-                 => (Int -> a -> Builder)
-                 -> Int -> Sum f g a -> Builder
-showbSumPrecWith sp p (InL x) = showbUnaryWith (showbPrecWith sp) "InL" p x
-showbSumPrecWith sp p (InR y) = showbUnaryWith (showbPrecWith sp) "InR" p y
-{-# INLINE showbSumPrecWith #-}
-
-instance (TextShow1 f, TextShow1 g, TextShow a) => TextShow (Compose f g a) where
-    showbPrec = showbPrec1
-    INLINE_INST_FUN(showbPrec)
-
-instance (TextShow1 f, TextShow1 g) => TextShow1 (Compose f g) where
-    showbPrecWith = showbComposePrecWith
-    INLINE_INST_FUN(showbPrecWith)
+liftShowbReversePrec sp sl p (Reverse x) =
+    showbUnaryWith (liftShowbPrec sp sl) "Reverse" p x
+{-# INLINE liftShowbReversePrec #-}
 
 instance TextShow a => TextShow (Constant a b) where
-    showbPrec = showbConstantPrecWith showbPrec
+    showbPrec = liftShowbConstantPrec showbPrec
     INLINE_INST_FUN(showbPrec)
 
 instance TextShow a => TextShow1 (Constant a) where
-    showbPrecWith = showbPrecWith2 showbPrec
-    INLINE_INST_FUN(showbPrecWith)
+    liftShowbPrec _ _ = liftShowbConstantPrec showbPrec
+    INLINE_INST_FUN(liftShowbPrec)
 
 instance TextShow2 Constant where
-    showbPrecWith2 sp _ = showbConstantPrecWith sp
-    INLINE_INST_FUN(showbPrecWith2)
-
-instance (TextShow1 f, TextShow1 g, TextShow a) => TextShow (Product f g a) where
-    showbPrec = showbPrec1
-    INLINE_INST_FUN(showbPrec)
-
-instance (TextShow1 f, TextShow1 g) => TextShow1 (Product f g) where
-    showbPrecWith = showbProductPrecWith
-    INLINE_INST_FUN(showbPrecWith)
+    liftShowbPrec2 sp _ _ _ = liftShowbConstantPrec sp
+    INLINE_INST_FUN(liftShowbPrec2)
 
 instance (TextShow1 f, TextShow a) => TextShow (Reverse f a) where
     showbPrec = showbPrec1
     INLINE_INST_FUN(showbPrec)
 
 instance TextShow1 f => TextShow1 (Reverse f) where
-    showbPrecWith = showbReversePrecWith
-    INLINE_INST_FUN(showbPrecWith)
-
-instance (TextShow1 f, TextShow1 g, TextShow a) => TextShow (Sum f g a) where
-    showbPrec = showbPrec1
-    INLINE_INST_FUN(showbPrec)
-
-instance (TextShow1 f, TextShow1 g) => TextShow1 (Sum f g) where
-    showbPrecWith = showbSumPrecWith
-    INLINE_INST_FUN(showbPrecWith)
+    liftShowbPrec = liftShowbReversePrec
+    INLINE_INST_FUN(liftShowbPrec)
diff --git a/src/TextShow/Data/List/NonEmpty.hs b/src/TextShow/Data/List/NonEmpty.hs
deleted file mode 100644
--- a/src/TextShow/Data/List/NonEmpty.hs
+++ /dev/null
@@ -1,31 +0,0 @@
-{-# LANGUAGE TemplateHaskell #-}
-{-# OPTIONS_GHC -fno-warn-orphans #-}
-{-|
-Module:      TextShow.Data.List.NonEmpty
-Copyright:   (C) 2014-2015 Ryan Scott
-License:     BSD-style (see the file LICENSE)
-Maintainer:  Ryan Scott
-Stability:   Provisional
-Portability: GHC
-
-Monomorphic 'TextShow' function for 'NonEmpty' lists.
-
-/Since: 2/
--}
-module TextShow.Data.List.NonEmpty (showbNonEmptyPrecWith) where
-
-import Data.List.NonEmpty (NonEmpty)
-
-import TextShow (Builder, showbPrecWith)
-import TextShow.TH (deriveTextShow, deriveTextShow1)
-
--- | Convert a 'NonEmpty' list to a 'Builder' with the given show function
--- and precedence.
---
--- /Since: 2/
-showbNonEmptyPrecWith :: (Int -> a -> Builder) -> Int -> NonEmpty a -> Builder
-showbNonEmptyPrecWith = showbPrecWith
-{-# INLINE showbNonEmptyPrecWith #-}
-
-$(deriveTextShow  ''NonEmpty)
-$(deriveTextShow1 ''NonEmpty)
diff --git a/src/TextShow/Data/Semigroup.hs b/src/TextShow/Data/Semigroup.hs
deleted file mode 100644
--- a/src/TextShow/Data/Semigroup.hs
+++ /dev/null
@@ -1,105 +0,0 @@
-{-# LANGUAGE CPP             #-}
-{-# LANGUAGE TemplateHaskell #-}
-{-# OPTIONS_GHC -fno-warn-orphans #-}
-{-|
-Module:      TextShow.Data.Semigroup
-Copyright:   (C) 2014-2015 Ryan Scott
-License:     BSD-style (see the file LICENSE)
-Maintainer:  Ryan Scott
-Stability:   Provisional
-Portability: GHC
-
-Monomorphic 'TextShow' functions for @Semigroup@ data types.
-
-/Since: 2/
--}
-module TextShow.Data.Semigroup (
-      showbMinPrecWith
-    , showbMaxPrecWith
-    , showbFirstPrecWith
-    , showbLastPrecWith
-    , showbWrappedMonoidPrecWith
-    , showbOptionPrecWith
-    , showbArgPrecWith2
-    ) where
-
-import Data.Semigroup (Min, Max, First, Last, WrappedMonoid, Option, Arg)
-
-import TextShow (Builder, showbPrecWith, showbPrecWith2)
-import TextShow.TH (deriveTextShow, deriveTextShow1, deriveTextShow2)
-
-#include "inline.h"
-
--- | Convert a 'Min' value to a 'Builder' with the given show function and precedence.
---
--- /Since: 2/
-showbMinPrecWith :: (Int -> a -> Builder) -> Int -> Min a -> Builder
-showbMinPrecWith = showbPrecWith
-{-# INLINE showbMinPrecWith #-}
-
--- | Convert a 'Max' value to a 'Builder' with the given show function and precedence.
---
--- /Since: 2/
-showbMaxPrecWith :: (Int -> a -> Builder) -> Int -> Max a -> Builder
-showbMaxPrecWith = showbPrecWith
-{-# INLINE showbMaxPrecWith #-}
-
--- | Convert a 'First' value to a 'Builder' with the given show function and precedence.
---
--- /Since: 2/
-showbFirstPrecWith :: (Int -> a -> Builder) -> Int -> First a -> Builder
-showbFirstPrecWith = showbPrecWith
-{-# INLINE showbFirstPrecWith #-}
-
--- | Convert a 'Last' value to a 'Builder' with the given show function and precedence.
---
--- /Since: 2/
-showbLastPrecWith :: (Int -> a -> Builder) -> Int -> Last a -> Builder
-showbLastPrecWith = showbPrecWith
-{-# INLINE showbLastPrecWith #-}
-
--- | Convert a 'WrappedMonoid' to a 'Builder' with the given show function
--- and precedence.
---
--- /Since: 2/
-showbWrappedMonoidPrecWith :: (Int -> m -> Builder) -> Int -> WrappedMonoid m -> Builder
-showbWrappedMonoidPrecWith = showbPrecWith
-{-# INLINE showbWrappedMonoidPrecWith #-}
-
--- | Convert an 'Option' value to a 'Builder' with the given show function
--- and precedence.
---
--- /Since: 2/
-showbOptionPrecWith :: (Int -> a -> Builder) -> Int -> Option a -> Builder
-showbOptionPrecWith = showbPrecWith
-{-# INLINE showbOptionPrecWith #-}
-
--- | Convert an 'Arg' value to a 'Builder' with the given show functions and precedence.
---
--- /Since: 2/
-showbArgPrecWith2 :: (Int -> a -> Builder) -> (Int -> b -> Builder)
-                  -> Int -> Arg a b -> Builder
-showbArgPrecWith2 = showbPrecWith2
-{-# INLINE showbArgPrecWith2 #-}
-
-$(deriveTextShow  ''Min)
-$(deriveTextShow1 ''Min)
-
-$(deriveTextShow  ''Max)
-$(deriveTextShow1 ''Max)
-
-$(deriveTextShow  ''First)
-$(deriveTextShow1 ''First)
-
-$(deriveTextShow  ''Last)
-$(deriveTextShow1 ''Last)
-
-$(deriveTextShow  ''WrappedMonoid)
-$(deriveTextShow1 ''WrappedMonoid)
-
-$(deriveTextShow  ''Option)
-$(deriveTextShow1 ''Option)
-
-$(deriveTextShow  ''Arg)
-$(deriveTextShow1 ''Arg)
-$(deriveTextShow2 ''Arg)
diff --git a/src/TextShow/Data/Tagged.hs b/src/TextShow/Data/Tagged.hs
--- a/src/TextShow/Data/Tagged.hs
+++ b/src/TextShow/Data/Tagged.hs
@@ -18,29 +18,29 @@
 
 /Since: 2/
 -}
-module TextShow.Data.Tagged (showbTaggedPrecWith) where
+module TextShow.Data.Tagged (liftShowbTaggedPrec) where
 
 import Data.Tagged (Tagged(..))
-import TextShow (TextShow(showbPrec), TextShow1(..), TextShow2(..),
+import TextShow (TextShow(..), TextShow1(..), TextShow2(..),
                  Builder, showbPrec1, showbUnaryWith)
 
 #include "inline.h"
 
 -- | Convert a 'Tagged' value to a 'Builder' with the given show function and precedence.
 --
--- /Since: 2/
-showbTaggedPrecWith :: (Int -> b -> Builder) -> Int -> Tagged s b -> Builder
-showbTaggedPrecWith sp p (Tagged b) = showbUnaryWith sp "Tagged" p b
-{-# INLINE showbTaggedPrecWith #-}
+-- /Since: 3/
+liftShowbTaggedPrec :: (Int -> b -> Builder) -> Int -> Tagged s b -> Builder
+liftShowbTaggedPrec sp p (Tagged b) = showbUnaryWith sp "Tagged" p b
+{-# INLINE liftShowbTaggedPrec #-}
 
 instance TextShow b => TextShow (Tagged s b) where
     showbPrec = showbPrec1
     INLINE_INST_FUN(showbPrec)
 
 instance TextShow1 (Tagged s) where
-    showbPrecWith = showbTaggedPrecWith
-    INLINE_INST_FUN(showbPrecWith)
+    liftShowbPrec sp _ = liftShowbTaggedPrec sp
+    INLINE_INST_FUN(liftShowbPrec)
 
 instance TextShow2 Tagged where
-    showbPrecWith2 _ = showbTaggedPrecWith
-    INLINE_INST_FUN(showbPrecWith2)
+    liftShowbPrec2 _ _ sp _ = liftShowbTaggedPrec sp
+    INLINE_INST_FUN(liftShowbPrec2)
diff --git a/src/TextShow/Data/Time.hs b/src/TextShow/Data/Time.hs
--- a/src/TextShow/Data/Time.hs
+++ b/src/TextShow/Data/Time.hs
@@ -33,6 +33,7 @@
 
 import Data.Fixed (Pico)
 import Data.Monoid.Compat
+import Data.Semigroup (mtimesDefault)
 import Data.Time.Calendar (Day, toGregorian)
 import Data.Time.Clock (DiffTime, UTCTime, NominalDiffTime)
 import Data.Time.Clock.TAI (AbsoluteTime, taiToUTCTime)
@@ -40,16 +41,13 @@
 import Data.Time.LocalTime (TimeZone(..), TimeOfDay(..), LocalTime(..), ZonedTime(..),
                             utc, utcToLocalTime, utcToZonedTime)
 
-import TextShow (TextShow(showb), Builder, FromStringShow(..),
+import TextShow (TextShow(..), Builder, FromStringShow(..),
                  fromString, lengthB, showbSpace, singleton)
 import TextShow.Data.Fixed (showbFixed)
 import TextShow.Data.Integral ()
-import TextShow.Utils (mtimesDefault)
 
 #if MIN_VERSION_time(1,5,0)
 import Data.Time.Format (TimeLocale)
-
-import TextShow (showbPrec)
 import TextShow.TH (deriveTextShow)
 #endif
 
diff --git a/src/TextShow/Data/UnorderedContainers.hs b/src/TextShow/Data/UnorderedContainers.hs
--- a/src/TextShow/Data/UnorderedContainers.hs
+++ b/src/TextShow/Data/UnorderedContainers.hs
@@ -13,9 +13,8 @@
 /Since: 2/
 -}
 module TextShow.Data.UnorderedContainers (
-      showbHashMapPrecWith2
-    , showbHashSetPrec
-    , showbHashSetPrecWith
+      liftShowbHashMapPrec2
+    , liftShowbHashSetPrec
     ) where
 
 import qualified Data.HashMap.Lazy as HM (toList)
@@ -23,52 +22,45 @@
 import qualified Data.HashSet as HS (toList)
 import           Data.HashSet (HashSet)
 
-import           TextShow (TextShow(showbPrec), TextShow1(..), TextShow2(..),
+import           TextShow (TextShow(..), TextShow1(..), TextShow2(..),
                            Builder, showbPrec1)
-import           TextShow.Data.Tuple (showb2TupleWith2)
-import           TextShow.Utils (showbUnaryList, showbUnaryListWith)
+import           TextShow.Utils (showbUnaryListWith)
 
 #include "inline.h"
 
 -- | Convert a 'HashMap' to a 'Builder' with the given show functions and precedence.
 --
--- /Since: 2/
-showbHashMapPrecWith2 :: (k -> Builder) -> (v -> Builder)
+-- /Since: 3/
+liftShowbHashMapPrec2 :: (k -> Builder) -> (v -> Builder)
                       -> Int -> HashMap k v -> Builder
-showbHashMapPrecWith2 sp1 sp2 p =
-    showbUnaryListWith (showb2TupleWith2 sp1 sp2) p . HM.toList
-{-# INLINE showbHashMapPrecWith2 #-}
-
--- | Convert a 'HashSet' to a 'Builder' with the given precedence.
---
--- /Since: 2/
-showbHashSetPrec :: TextShow a => Int -> HashSet a -> Builder
-showbHashSetPrec p = showbUnaryList p . HS.toList
-{-# INLINE showbHashSetPrec #-}
+liftShowbHashMapPrec2 sp1 sp2 p =
+    showbUnaryListWith (liftShowbList2 (const sp1) undefined
+                                       (const sp2) undefined) p . HM.toList
+{-# INLINE liftShowbHashMapPrec2 #-}
 
 -- | Convert a 'HashSet' to a 'Builder' with the given show function and precedence.
 --
--- /Since: 2/
-showbHashSetPrecWith :: (a -> Builder) -> Int -> HashSet a -> Builder
-showbHashSetPrecWith sp p = showbUnaryListWith sp p . HS.toList
-{-# INLINE showbHashSetPrecWith #-}
+-- /Since: 3/
+liftShowbHashSetPrec :: ([a] -> Builder) -> Int -> HashSet a -> Builder
+liftShowbHashSetPrec sl p = showbUnaryListWith sl p . HS.toList
+{-# INLINE liftShowbHashSetPrec #-}
 
 instance (TextShow k, TextShow v) => TextShow (HashMap k v) where
     showbPrec = showbPrec1
     INLINE_INST_FUN(showbPrec)
 
 instance TextShow k => TextShow1 (HashMap k) where
-    showbPrecWith = showbPrecWith2 showbPrec
-    INLINE_INST_FUN(showbPrecWith)
+    liftShowbPrec = liftShowbPrec2 showbPrec showbList
+    INLINE_INST_FUN(liftShowbPrec)
 
 instance TextShow2 HashMap where
-    showbPrecWith2 sp1 sp2 = showbHashMapPrecWith2 (sp1 0) (sp2 0)
-    INLINE_INST_FUN(showbPrecWith2)
+    liftShowbPrec2 sp1 _ sp2 _ = liftShowbHashMapPrec2 (sp1 0) (sp2 0)
+    INLINE_INST_FUN(liftShowbPrec2)
 
 instance TextShow a => TextShow (HashSet a) where
-    showbPrec = showbHashSetPrec
+    showbPrec = showbPrec1
     INLINE_INST_FUN(showbPrec)
 
 instance TextShow1 HashSet where
-    showbPrecWith sp = showbHashSetPrecWith $ sp 0
-    INLINE_INST_FUN(showbPrecWith)
+    liftShowbPrec _ = liftShowbHashSetPrec
+    INLINE_INST_FUN(liftShowbPrec)
diff --git a/src/TextShow/Data/Vector.hs b/src/TextShow/Data/Vector.hs
--- a/src/TextShow/Data/Vector.hs
+++ b/src/TextShow/Data/Vector.hs
@@ -14,10 +14,9 @@
 /Since: 2/
 -}
 module TextShow.Data.Vector (
-      showbVectorPrec
-    , showbVectorPrecWith
+      liftShowbVectorPrec
     , showbVectorGenericPrec
-    , showbVectorGenericPrecWith
+    , liftShowbVectorGenericPrec
     , showbVectorPrimitivePrec
     , showbVectorStorablePrec
     , showbVectorUnboxedPrec
@@ -48,22 +47,14 @@
 
 #include "inline.h"
 
--- | Convert a boxed 'B.Vector' to a 'Builder' with the given precedence.
--- Note that with @vector-0.11@ and above, the precedence argument is ignored.
---
--- /Since: 2/
-showbVectorPrec :: TextShow a => Int -> B.Vector a -> Builder
-showbVectorPrec = showbVectorGenericPrec
-{-# INLINE showbVectorPrec #-}
-
 -- | Convert a boxed 'B.Vector' to a 'Builder' with the given show function
 -- and precedence.
 -- Note that with @vector-0.11@ and above, the precedence argument is ignored.
 --
--- /Since: 2/
-showbVectorPrecWith :: (a -> Builder) -> Int -> B.Vector a -> Builder
-showbVectorPrecWith = showbVectorGenericPrecWith
-{-# INLINE showbVectorPrecWith #-}
+-- /Since: 3/
+liftShowbVectorPrec :: ([a] -> Builder) -> Int -> B.Vector a -> Builder
+liftShowbVectorPrec = liftShowbVectorGenericPrec
+{-# INLINE liftShowbVectorPrec #-}
 
 -- | Convert a generic 'G.Vector' to a 'Builder' with the given precedence.
 -- Note that with @vector-0.11@ and above, the precedence argument is ignored.
@@ -71,9 +62,9 @@
 -- /Since: 2/
 showbVectorGenericPrec :: (G.Vector v a, TextShow a) => Int -> v a -> Builder
 #if MIN_VERSION_vector(0,11,0)
-showbVectorGenericPrec _ = showb . toList
+showbVectorGenericPrec _ = showbList . toList
 #else
-showbVectorGenericPrec p = showbUnaryList p . toList
+showbVectorGenericPrec p = showbUnaryListWith showbList p . toList
 #endif
 {-# INLINE showbVectorGenericPrec #-}
 
@@ -81,14 +72,14 @@
 -- and precedence.
 -- Note that with @vector-0.11@ and above, the precedence argument is ignored.
 --
--- /Since: 2/
-showbVectorGenericPrecWith :: G.Vector v a => (a -> Builder) -> Int -> v a -> Builder
+-- /Since: 3/
+liftShowbVectorGenericPrec :: G.Vector v a => ([a] -> Builder) -> Int -> v a -> Builder
 #if MIN_VERSION_vector(0,11,0)
-showbVectorGenericPrecWith sp p = showbPrecWith (const sp) p . toList
+liftShowbVectorGenericPrec sl _ = sl . toList
 #else
-showbVectorGenericPrecWith sp p = showbUnaryListWith sp p . toList
+liftShowbVectorGenericPrec sl p = showbUnaryListWith sl p . toList
 #endif
-{-# INLINE showbVectorGenericPrecWith #-}
+{-# INLINE liftShowbVectorGenericPrec #-}
 
 -- | Convert a primitive 'P.Vector' to a 'Builder' with the given precedence.
 -- Note that with @vector-0.11@ and above, the precedence argument is ignored.
@@ -122,12 +113,12 @@
 {-# INLINE showbSizePrec #-}
 
 instance TextShow a => TextShow (B.Vector a) where
-    showbPrec = showbVectorPrec
+    showbPrec = showbVectorGenericPrec
     INLINE_INST_FUN(showbPrec)
 
 instance TextShow1 B.Vector where
-    showbPrecWith sp = showbVectorPrecWith $ sp 0
-    INLINE_INST_FUN(showbPrecWith)
+    liftShowbPrec _ sl = liftShowbVectorPrec sl
+    INLINE_INST_FUN(liftShowbPrec)
 
 instance (TextShow a, Prim a) => TextShow (P.Vector a) where
     showbPrec = showbVectorPrimitivePrec
diff --git a/src/TextShow/Instances.hs b/src/TextShow/Instances.hs
--- a/src/TextShow/Instances.hs
+++ b/src/TextShow/Instances.hs
@@ -37,8 +37,6 @@
 import TextShow.Data.Binary               ()
 import TextShow.Data.Containers           ()
 import TextShow.Data.Functor.Trans        ()
-import TextShow.Data.List.NonEmpty        ()
-import TextShow.Data.Semigroup            ()
 import TextShow.Data.Tagged               ()
 import TextShow.Data.Time                 ()
 import TextShow.Data.UnorderedContainers  ()
diff --git a/src/TextShow/Language/Haskell/TH.hs b/src/TextShow/Language/Haskell/TH.hs
--- a/src/TextShow/Language/Haskell/TH.hs
+++ b/src/TextShow/Language/Haskell/TH.hs
@@ -1,10 +1,8 @@
 {-# LANGUAGE CPP                  #-}
 {-# LANGUAGE FlexibleInstances    #-}
+{-# LANGUAGE MagicHash            #-}
 {-# LANGUAGE TemplateHaskell      #-}
 {-# LANGUAGE TypeSynonymInstances #-}
-#if !(MIN_VERSION_template_haskell(2,10,0))
-{-# LANGUAGE MagicHash            #-}
-#endif
 {-# OPTIONS_GHC -fno-warn-orphans #-}
 {-|
 Module:      TextShow.Language.Haskell.TH
@@ -23,6 +21,9 @@
       showbAnnLookupPrec
     , showbAnnTargetPrec,
 #endif
+#if MIN_VERSION_template_haskell(2,11,0)
+      showbBangPrec,
+#endif
       showbBodyPrec
     , showbCallconv
 #if MIN_VERSION_template_haskell(2,5,0) && !(MIN_VERSION_template_haskell(2,7,0))
@@ -30,15 +31,24 @@
 #endif
     , showbClausePrec
     , showbConPrec
+#if MIN_VERSION_template_haskell(2,11,0)
+    , showbDecidedStrictness
+#endif
     , showbDecPrec
     , showbExpPrec
     , showbFamFlavour
+#if MIN_VERSION_template_haskell(2,11,0)
+    , showbFamilyResultSigPrec
+#endif
     , showbFixityPrec
     , showbFixityDirection
     , showbForeignPrec
     , showbFunDepPrec
     , showbGuardPrec
     , showbInfoPrec
+#if MIN_VERSION_template_haskell(2,11,0)
+    , showbInjectivityAnnPrec
+#endif
 #if MIN_VERSION_template_haskell(2,8,0)
     , showbInline
 #else
@@ -72,16 +82,23 @@
     , showbRuleMatch
 #endif
     , showbSafety
+#if MIN_VERSION_template_haskell(2,11,0)
+    , showbSourceStrictness
+    , showbSourceUnpackedness
+#endif
     , showbStmtPrec
-    , showbStrict
+    , showbStrictPrec
+#if MIN_VERSION_template_haskell(2,11,0)
+    , showbTypeFamilyHeadPrec
+#endif
 #if MIN_VERSION_template_haskell(2,8,0)
     , showbTyLitPrec
 #endif
     , showbTypePrec
-    , showbTyVarBndrPrec
 #if MIN_VERSION_template_haskell(2,9,0)
     , showbTySynEqnPrec
 #endif
+    , showbTyVarBndrPrec
     , showbDoc
     ) where
 
@@ -98,7 +115,7 @@
 import           Language.Haskell.TH.PprLib (Doc, to_HPJ_Doc)
 import           Language.Haskell.TH.Syntax
 
-import           TextShow (TextShow(showb, showbPrec), Builder,
+import           TextShow (TextShow(..), Builder,
                            fromString, singleton, toLazyText)
 import           TextShow.Data.Integral (showbIntPrec)
 import           TextShow.Text.PrettyPrint (renderB)
@@ -330,11 +347,18 @@
 showbStmtPrec :: Int -> Stmt -> Builder
 showbStmtPrec = showbPrec
 
--- | Convert a 'Strict' to a 'Builder'.
+-- | Convert a 'Strict' to a 'Builder' with the given precedence.
+-- Note that 'Strict' is a type synonym for 'Bang' on @template-haskell-2.11.0.0@
+-- and later, and precedence matters for 'Bang'. On earlier versions of
+-- @template-haskell@, however, the precedence argument is ignored.
 --
--- /Since: 2/
-showbStrict :: Strict -> Builder
-showbStrict = showb
+-- /Since: 3/
+showbStrictPrec :: Int -> Strict -> Builder
+#if MIN_VERSION_template_haskell(2,11,0)
+showbStrictPrec = showbBangPrec
+#else
+showbStrictPrec = showbPrec
+#endif
 
 -- | Convert a 'Type' to a 'Builder' with the given precedence.
 --
@@ -451,6 +475,57 @@
 showbTySynEqnPrec = showbPrec
 #endif
 
+#if MIN_VERSION_template_haskell(2,11,0)
+-- | Convert a 'Bang' to a 'Builder' with the given precedence.
+-- This function is only available with @template-haskell-2.11.0.0@ or later.
+--
+-- /Since: 3/
+showbBangPrec :: Int -> Bang -> Builder
+showbBangPrec = showbPrec
+
+-- | Convert a 'DecidedStrictness' to a 'Builder'.
+-- This function is only available with @template-haskell-2.11.0.0@ or later.
+--
+-- /Since: 3/
+showbDecidedStrictness :: DecidedStrictness -> Builder
+showbDecidedStrictness = showb
+
+-- | Convert a 'FamilyResultSig' to a 'Builder' with the given precedence.
+-- This function is only available with @template-haskell-2.11.0.0@ or later.
+--
+-- /Since: 3/
+showbFamilyResultSigPrec :: Int -> FamilyResultSig -> Builder
+showbFamilyResultSigPrec = showbPrec
+
+-- | Convert an 'InjectivityAnn' to a 'Builder' with the given precedence.
+-- This function is only available with @template-haskell-2.11.0.0@ or later.
+--
+-- /Since: 3/
+showbInjectivityAnnPrec :: Int -> InjectivityAnn -> Builder
+showbInjectivityAnnPrec = showbPrec
+
+-- | Convert a 'SourceStrictness' to a 'Builder'.
+-- This function is only available with @template-haskell-2.11.0.0@ or later.
+--
+-- /Since: 3/
+showbSourceStrictness :: SourceStrictness -> Builder
+showbSourceStrictness = showb
+
+-- | Convert a 'SourceUnpackedness' to a 'Builder'.
+-- This function is only available with @template-haskell-2.11.0.0@ or later.
+--
+-- /Since: 3/
+showbSourceUnpackedness :: SourceUnpackedness -> Builder
+showbSourceUnpackedness = showb
+
+-- | Convert an 'TypeFamilyHead' to a 'Builder' with the given precedence.
+-- This function is only available with @template-haskell-2.11.0.0@ or later.
+--
+-- /Since: 3/
+showbTypeFamilyHeadPrec :: Int -> TypeFamilyHead -> Builder
+showbTypeFamilyHeadPrec = showbPrec
+#endif
+
 $(deriveTextShow ''Body)
 $(deriveTextShow ''Callconv)
 $(deriveTextShow ''Clause)
@@ -479,7 +554,6 @@
 $(deriveTextShow ''Range)
 $(deriveTextShow ''Safety)
 $(deriveTextShow ''Stmt)
-$(deriveTextShow ''Strict)
 $(deriveTextShow ''Type)
 $(deriveTextShow ''TyVarBndr)
 
@@ -512,4 +586,16 @@
 
 #if !(MIN_VERSION_template_haskell(2,10,0))
 $(deriveTextShow ''Pred)
+#endif
+
+#if MIN_VERSION_template_haskell(2,11,0)
+$(deriveTextShow ''Bang)
+$(deriveTextShow ''DecidedStrictness)
+$(deriveTextShow ''FamilyResultSig)
+$(deriveTextShow ''InjectivityAnn)
+$(deriveTextShow ''SourceStrictness)
+$(deriveTextShow ''SourceUnpackedness)
+$(deriveTextShow ''TypeFamilyHead)
+#else
+$(deriveTextShow ''Strict)
 #endif
diff --git a/src/TextShow/System/Console/Haskeline.hs b/src/TextShow/System/Console/Haskeline.hs
--- a/src/TextShow/System/Console/Haskeline.hs
+++ b/src/TextShow/System/Console/Haskeline.hs
@@ -25,7 +25,7 @@
 import System.Console.Haskeline.Completion (Completion)
 import System.Console.Haskeline.History (History, historyLines)
 
-import TextShow (TextShow(showb, showbPrec), Builder, FromStringShow(..))
+import TextShow (TextShow(..), Builder, FromStringShow(..))
 import TextShow.TH (deriveTextShow)
 import TextShow.Utils (showbUnaryListWith)
 
diff --git a/src/TextShow/System/Console/Terminfo.hs b/src/TextShow/System/Console/Terminfo.hs
--- a/src/TextShow/System/Console/Terminfo.hs
+++ b/src/TextShow/System/Console/Terminfo.hs
@@ -29,7 +29,7 @@
 import System.Console.Terminfo.Base (SetupTermError)
 import System.Console.Terminfo.Color (Color)
 
-import TextShow (TextShow(showb, showbPrec), Builder, FromStringShow(..))
+import TextShow (TextShow(..), Builder, FromStringShow(..))
 import TextShow.TH (deriveTextShow)
 
 #include "inline.h"
diff --git a/src/TextShow/System/Directory.hs b/src/TextShow/System/Directory.hs
--- a/src/TextShow/System/Directory.hs
+++ b/src/TextShow/System/Directory.hs
@@ -16,7 +16,7 @@
 
 import System.Directory (Permissions)
 
-import TextShow (TextShow(showbPrec), Builder)
+import TextShow (TextShow(..), Builder)
 import TextShow.TH (deriveTextShow)
 
 -- | Convert 'Permissions' to a 'Builder' with the given precedence.
diff --git a/src/TextShow/System/Locale.hs b/src/TextShow/System/Locale.hs
--- a/src/TextShow/System/Locale.hs
+++ b/src/TextShow/System/Locale.hs
@@ -16,7 +16,7 @@
 
 import System.Locale (TimeLocale)
 
-import TextShow (TextShow(showbPrec), Builder)
+import TextShow (TextShow(..), Builder)
 import TextShow.TH (deriveTextShow)
 
 -- | Convert a 'TimeLocale' to a 'Builder' with the given precedence.
diff --git a/src/TextShow/System/Posix.hs b/src/TextShow/System/Posix.hs
--- a/src/TextShow/System/Posix.hs
+++ b/src/TextShow/System/Posix.hs
@@ -33,7 +33,7 @@
 import System.Posix.Process (ProcessStatus)
 import System.Posix.User (GroupEntry, UserEntry)
 
-import TextShow (Builder, showb, showbPrec)
+import TextShow (TextShow(..), Builder)
 import TextShow.TH (deriveTextShow)
 
 -- | Convert an 'RTLDFlags' value to a 'Builder'.
diff --git a/src/TextShow/System/Random.hs b/src/TextShow/System/Random.hs
--- a/src/TextShow/System/Random.hs
+++ b/src/TextShow/System/Random.hs
@@ -15,7 +15,7 @@
 module TextShow.System.Random (showbStdGenPrec) where
 
 import System.Random (StdGen)
-import TextShow (TextShow(showbPrec), Builder, FromStringShow(..))
+import TextShow (TextShow(..), Builder, FromStringShow(..))
 
 #include "inline.h"
 
diff --git a/src/TextShow/System/Time.hs b/src/TextShow/System/Time.hs
--- a/src/TextShow/System/Time.hs
+++ b/src/TextShow/System/Time.hs
@@ -25,7 +25,7 @@
 import System.Time (ClockTime, TimeDiff, CalendarTime, Month, Day,
                     calendarTimeToString, toCalendarTime)
 
-import TextShow (TextShow(showb, showbPrec), Builder, fromString)
+import TextShow (TextShow(..), Builder, fromString)
 import TextShow.TH (deriveTextShow)
 
 #include "inline.h"
diff --git a/src/TextShow/System/Win32.hs b/src/TextShow/System/Win32.hs
--- a/src/TextShow/System/Win32.hs
+++ b/src/TextShow/System/Win32.hs
@@ -39,7 +39,7 @@
 import System.Win32.Info (ProcessorArchitecture, SYSTEM_INFO)
 import System.Win32.Time (FILETIME, SYSTEMTIME, TIME_ZONE_INFORMATION, TimeZoneId)
 
-import TextShow (Builder, showb, showbPrec)
+import TextShow (TextShow(..), Builder)
 import TextShow.TH (deriveTextShow)
 
 -- | Convert a 'DebugEventInfo' value to a 'Builder' with the given precedence.
diff --git a/src/TextShow/Text/PrettyPrint.hs b/src/TextShow/Text/PrettyPrint.hs
--- a/src/TextShow/Text/PrettyPrint.hs
+++ b/src/TextShow/Text/PrettyPrint.hs
@@ -16,25 +16,42 @@
 module TextShow.Text.PrettyPrint (
       renderB
     , renderStyleB
+#if MIN_VERSION_pretty(1,1,3)
+    , renderAnnotB
+    , renderStyleAnnotB
+#endif
     , showbMode
     , showbStylePrec
     , showbTextDetailsPrec
 #if MIN_VERSION_pretty(1,1,2)
     , showbPrettyLevelPrec
 #endif
+#if MIN_VERSION_pretty(1,1,3)
+    , liftShowbAnnotDetailsPrec
+    , showbPrettyLevelAnnotPrec
+    , liftShowbSpanPrec
+#endif
     ) where
 
-import Data.Monoid.Compat
+import           Data.Monoid.Compat
 
-import Text.PrettyPrint.HughesPJ (Doc, Mode, Style(..), TextDetails(..),
-                                  fullRender, style)
+import           Text.PrettyPrint.HughesPJ (Doc, Mode, Style(..), TextDetails(..),
+                                            fullRender, style)
 #if MIN_VERSION_pretty(1,1,2)
-import Text.PrettyPrint.HughesPJClass (PrettyLevel)
+import           Text.PrettyPrint.HughesPJClass (PrettyLevel)
 #endif
+#if MIN_VERSION_pretty(1,1,3)
+import qualified Text.PrettyPrint.Annotated.HughesPJ as Annot (Doc, fullRender, style)
+import           Text.PrettyPrint.Annotated.HughesPJ (AnnotDetails, Span)
+import qualified Text.PrettyPrint.Annotated.HughesPJClass as Annot (PrettyLevel)
 
-import TextShow (TextShow(showb, showbPrec), Builder, fromString, singleton)
-import TextShow.TH (deriveTextShow)
+import           TextShow (TextShow1(..))
+import           TextShow.TH (deriveTextShow1)
+#endif
 
+import           TextShow (TextShow(..), Builder, fromString, singleton)
+import           TextShow.TH (deriveTextShow)
+
 #include "inline.h"
 
 -- | Renders a 'Doc' to a 'Builder' using the default 'style'.
@@ -93,6 +110,53 @@
 {-# INLINE showbPrettyLevelPrec #-}
 #endif
 
+#if MIN_VERSION_pretty(1,1,3)
+-- | Renders an annotated 'Doc' to a 'Builder' using the default 'Annot.style'.
+-- This function is only available with @pretty-1.1.3@ or later.
+--
+-- /Since: 3/
+renderAnnotB :: Annot.Doc a -> Builder
+renderAnnotB = renderStyleAnnotB Annot.style
+{-# INLINE renderAnnotB #-}
+
+-- | Renders an annotated 'Doc' to a 'Builder' using the given 'Style'.
+-- This function is only available with @pretty-1.1.3@ or later.
+--
+-- /Since: 3/
+renderStyleAnnotB :: Style -> Annot.Doc a -> Builder
+renderStyleAnnotB sty doc =
+    Annot.fullRender (mode sty)
+                     (lineLength sty)
+                     (ribbonsPerLine sty)
+                     txtPrinter
+                     mempty
+                     doc
+
+-- | Convert an 'AnnotDetais' value to a 'Builder' with the given show function
+-- and precedence. This function is only available with @pretty-1.1.3@ or later.
+--
+-- /Since: 3/
+liftShowbAnnotDetailsPrec :: (Int -> a -> Builder) -> Int -> AnnotDetails a -> Builder
+liftShowbAnnotDetailsPrec sp = liftShowbPrec sp undefined
+{-# INLINE liftShowbAnnotDetailsPrec #-}
+
+-- | Convert an annotated 'PrettyLevel' value to a 'Builder' with the given precedence.
+-- This function is only available with @pretty-1.1.3@ or later.
+--
+-- /Since: 3/
+showbPrettyLevelAnnotPrec :: Int -> Annot.PrettyLevel -> Builder
+showbPrettyLevelAnnotPrec = showbPrec
+{-# INLINE showbPrettyLevelAnnotPrec #-}
+
+-- | Convert a 'Span' to a 'Builder' with the given show function and precedence.
+-- This function is only available with @pretty-1.1.3@ or later.
+--
+-- /Since: 3/
+liftShowbSpanPrec :: (Int -> a -> Builder) -> Int -> Span a -> Builder
+liftShowbSpanPrec sp = liftShowbPrec sp undefined
+{-# INLINE liftShowbSpanPrec #-}
+#endif
+
 instance TextShow Doc where
     showb = renderB
     INLINE_INST_FUN(showb)
@@ -103,4 +167,21 @@
 
 #if MIN_VERSION_pretty(1,1,2)
 $(deriveTextShow ''PrettyLevel)
+#endif
+
+#if MIN_VERSION_pretty(1,1,3)
+$(deriveTextShow  ''AnnotDetails)
+$(deriveTextShow1 ''AnnotDetails)
+
+instance TextShow (Annot.Doc a) where
+    showb = renderAnnotB
+    INLINE_INST_FUN(showb)
+instance TextShow1 Annot.Doc where
+    liftShowbPrec _ _ = showbPrec
+    INLINE_INST_FUN(liftShowbPrec)
+
+$(deriveTextShow ''Annot.PrettyLevel)
+
+$(deriveTextShow  ''Span)
+$(deriveTextShow1 ''Span)
 #endif
diff --git a/src/TextShow/Trace/Hpc.hs b/src/TextShow/Trace/Hpc.hs
--- a/src/TextShow/Trace/Hpc.hs
+++ b/src/TextShow/Trace/Hpc.hs
@@ -25,7 +25,7 @@
 
 import Data.Monoid.Compat
 
-import TextShow (TextShow(showb, showbPrec), Builder, FromStringShow(..), singleton)
+import TextShow (TextShow(..), Builder, FromStringShow(..), singleton)
 import TextShow.Data.Integral (showbIntPrec)
 import TextShow.Data.Time ()
 import TextShow.TH (deriveTextShow)
diff --git a/src/TextShow/Utils.hs b/src/TextShow/Utils.hs
--- a/src/TextShow/Utils.hs
+++ b/src/TextShow/Utils.hs
@@ -1,4 +1,3 @@
-{-# LANGUAGE CPP               #-}
 {-# LANGUAGE OverloadedStrings #-}
 
 {-|
@@ -11,40 +10,11 @@
 
 Miscellaneous utility functions.
 -}
-module TextShow.Utils (
-      mtimesDefault
-    , showbUnaryListWith
-    , showbUnaryList
-    ) where
-
-#if MIN_VERSION_semigroups(0,17,0)
-import Data.Semigroup (mtimesDefault)
-#else
-import Data.Semigroup (timesN)
-#endif
-
-import TextShow (TextShow(showbPrec), Builder, showbUnaryWith)
-import TextShow.Data.List (showbListWith)
+module TextShow.Utils (showbUnaryListWith) where
 
-#if !(MIN_VERSION_semigroups(0,17,0))
--- | Repeat a value @n@ times.
---
--- > mtimesDefault n a = a <> a <> ... <> a  -- using <> (n-1) times
-mtimesDefault :: (Integral b, Monoid a) => b -> a -> a
-mtimesDefault = timesN . fromIntegral
-{-# INLINE mtimesDefault #-}
-#endif
+import TextShow (Builder, showbUnaryWith)
 
 -- | This pattern is used frequently when showing container types.
-showbUnaryListWith :: (a -> Builder) -> Int -> [a] -> Builder
-showbUnaryListWith sp p = showbUnaryWith (const $ showbListWith sp) "fromList" p
+showbUnaryListWith :: ([a] -> Builder) -> Int -> [a] -> Builder
+showbUnaryListWith sl p = showbUnaryWith (const sl) "fromList" p
 {-# INLINE showbUnaryListWith #-}
-
--- | This pattern is used frequently when showing container types.
---
--- We define this separately from 'showbUnaryListWith' since calling 'showbPrec' on
--- a list may result in different output than 'showbListWith' (since a 'Show'
--- instance may override 'showbList').
-showbUnaryList :: TextShow a => Int -> [a] -> Builder
-showbUnaryList p = showbUnaryWith showbPrec "fromList" p
-{-# INLINE showbUnaryList #-}
diff --git a/tests/Instances/Data/Bifunctor.hs b/tests/Instances/Data/Bifunctor.hs
--- a/tests/Instances/Data/Bifunctor.hs
+++ b/tests/Instances/Data/Bifunctor.hs
@@ -18,6 +18,7 @@
 
 import Data.Bifunctor.Biff (Biff(..))
 import Data.Bifunctor.Clown (Clown(..))
+import Data.Bifunctor.Fix (Fix(..))
 import Data.Bifunctor.Flip (Flip(..))
 import Data.Bifunctor.Join (Join(..))
 import Data.Bifunctor.Joker (Joker(..))
@@ -32,6 +33,7 @@
 
 deriving instance Arbitrary (p (f a) (g b)) => Arbitrary (Biff p f g a b)
 deriving instance Arbitrary (f a)           => Arbitrary (Clown f a b)
+deriving instance Arbitrary (p (Fix p a) a) => Arbitrary (Fix p a)
 deriving instance Arbitrary (p b a)         => Arbitrary (Flip p a b)
 deriving instance Arbitrary (p a a)         => Arbitrary (Join p a)
 deriving instance Arbitrary (g b)           => Arbitrary (Joker g a b)
diff --git a/tests/Instances/Data/List/NonEmpty.hs b/tests/Instances/Data/List/NonEmpty.hs
deleted file mode 100644
--- a/tests/Instances/Data/List/NonEmpty.hs
+++ /dev/null
@@ -1,22 +0,0 @@
-{-# OPTIONS_GHC -fno-warn-orphans #-}
-{-|
-Module:      Instances.Data.List.NonEmpty
-Copyright:   (C) 2014-2015 Ryan Scott
-License:     BSD-style (see the file LICENSE)
-Maintainer:  Ryan Scott
-Stability:   Provisional
-Portability: GHC
-
-Provides an 'Arbitrary' instance for 'NonEmpty' lists.
--}
-module Instances.Data.List.NonEmpty () where
-
-import Data.List.NonEmpty (NonEmpty(..))
-
-import Prelude ()
-import Prelude.Compat
-
-import Test.QuickCheck (Arbitrary(..))
-
-instance Arbitrary a => Arbitrary (NonEmpty a) where
-    arbitrary = (:|) <$> arbitrary <*> arbitrary
diff --git a/tests/Instances/Data/Semigroup.hs b/tests/Instances/Data/Semigroup.hs
deleted file mode 100644
--- a/tests/Instances/Data/Semigroup.hs
+++ /dev/null
@@ -1,32 +0,0 @@
-{-# LANGUAGE GeneralizedNewtypeDeriving #-}
-{-# LANGUAGE StandaloneDeriving         #-}
-{-# OPTIONS_GHC -fno-warn-orphans #-}
-{-|
-Module:      Instances.Data.Semigroup
-Copyright:   (C) 2014-2015 Ryan Scott
-License:     BSD-style (see the file LICENSE)
-Maintainer:  Ryan Scott
-Stability:   Provisional
-Portability: GHC
-
-Provides 'Arbitrary' instances for @Semigroup@ data types.
--}
-module Instances.Data.Semigroup () where
-
-import Data.Semigroup (Min(..), Max(..), First(..), Last(..),
-                       WrappedMonoid(..), Option(..), Arg(..))
-
-import Prelude ()
-import Prelude.Compat
-
-import Test.QuickCheck (Arbitrary(..))
-
-deriving instance Arbitrary a => Arbitrary (Min a)
-deriving instance Arbitrary a => Arbitrary (Max a)
-deriving instance Arbitrary a => Arbitrary (First a)
-deriving instance Arbitrary a => Arbitrary (Last a)
-deriving instance Arbitrary m => Arbitrary (WrappedMonoid m)
-deriving instance Arbitrary a => Arbitrary (Option a)
-
-instance (Arbitrary a, Arbitrary b) => Arbitrary (Arg a b) where
-    arbitrary = Arg <$> arbitrary <*> arbitrary
diff --git a/tests/Instances/Language/Haskell/TH.hs b/tests/Instances/Language/Haskell/TH.hs
--- a/tests/Instances/Language/Haskell/TH.hs
+++ b/tests/Instances/Language/Haskell/TH.hs
@@ -50,10 +50,14 @@
 --     arbitrary = Clause <$> arbitrary <*> arbitrary <*> arbitrary
 
 instance Arbitrary Con where
-    arbitrary = oneof [ NormalC <$> arbitrary <*> arbitrary
-                      , RecC    <$> arbitrary <*> arbitrary
-                      , InfixC  <$> arbitrary <*> arbitrary <*> arbitrary
-                      , ForallC <$> arbitrary <@> [fPred]   <@> fCon
+    arbitrary = oneof [ NormalC  <$> arbitrary <*> arbitrary
+                      , RecC     <$> arbitrary <*> arbitrary
+                      , InfixC   <$> arbitrary <*> arbitrary <*> arbitrary
+                      , ForallC  <$> arbitrary <@> [fPred]   <@> fCon
+#if MIN_VERSION_template_haskell(2,11,0)
+                      , GadtC    <$> arbitrary <*> arbitrary <*> arbitrary
+                      , RecGadtC <$> arbitrary <*> arbitrary <*> arbitrary
+#endif
                       ]
 --     arbitrary = oneof [ NormalC <$> arbitrary <*> arbitrary
 --                       , RecC    <$> arbitrary <*> arbitrary
@@ -65,22 +69,50 @@
     arbitrary = oneof [
           FunD <$> arbitrary <@> [fClause]
         , pure $ ValD fPat fBody [fDec]
-        , DataD [fPred] <$> arbitrary <*> arbitrary <*> arbitrary <*> arbitrary
-        , NewtypeD [fPred] <$> arbitrary <*> arbitrary <*> arbitrary <*> arbitrary
+        , DataD [fPred] <$> arbitrary
+                        <*> arbitrary
+#if MIN_VERSION_template_haskell(2,11,0)
+                        <*> arbitrary
+#endif
+                        <*> arbitrary
+                        <*> arbitrary
+        , NewtypeD [fPred] <$> arbitrary
+                           <*> arbitrary
+#if MIN_VERSION_template_haskell(2,11,0)
+                           <*> arbitrary
+#endif
+                           <*> arbitrary
+                           <*> arbitrary
         , TySynD <$> arbitrary <*> arbitrary <*> arbitrary
         , ClassD [fPred] <$> arbitrary <*> arbitrary <*> arbitrary <@> [fDec]
         , InstanceD [fPred] <$> arbitrary <@> [fDec]
         , SigD <$> arbitrary <*> arbitrary
         , ForeignD <$> arbitrary
         , PragmaD <$> arbitrary
-        , FamilyD <$> arbitrary <*> arbitrary <*> arbitrary <*> arbitrary
-        , DataInstD [fPred] <$> arbitrary <*> arbitrary <*> arbitrary <*> arbitrary
-        , NewtypeInstD [fPred] <$> arbitrary <*> arbitrary <*> arbitrary <*> arbitrary
+        , DataInstD [fPred] <$> arbitrary
+                            <*> arbitrary
+#if MIN_VERSION_template_haskell(2,11,0)
+                            <*> arbitrary
+#endif
+                            <*> arbitrary
+                            <*> arbitrary
+        , NewtypeInstD [fPred] <$> arbitrary
+                               <*> arbitrary
+#if MIN_VERSION_template_haskell(2,11,0)
+                               <*> arbitrary
+#endif
+                               <*> arbitrary
+                               <*> arbitrary
 #if MIN_VERSION_template_haskell(2,8,0)
         , InfixD <$> arbitrary <*> arbitrary
 #endif
 #if MIN_VERSION_template_haskell(2,9,0)
-        , ClosedTypeFamilyD <$> arbitrary <*> arbitrary <*> arbitrary <*> arbitrary
+        , ClosedTypeFamilyD <$> arbitrary
+                            <*> arbitrary
+# if !(MIN_VERSION_template_haskell(2,11,0))
+                            <*> arbitrary
+                            <*> arbitrary
+# endif
         , RoleAnnotD <$> arbitrary <*> arbitrary
         , TySynInstD <$> arbitrary <*> arbitrary
 #else
@@ -90,6 +122,12 @@
         , StandaloneDerivD <$> arbitrary <*> arbitrary
         , DefaultSigD <$> arbitrary <*> arbitrary
 #endif
+#if MIN_VERSION_template_haskell(2,11,0)
+        , DataFamilyD <$> arbitrary <*> arbitrary <*> arbitrary
+        , OpenTypeFamilyD <$> arbitrary
+#else
+        , FamilyD <$> arbitrary <*> arbitrary <*> arbitrary <*> arbitrary
+#endif
         ]
 --     arbitrary = oneof [
 --           FunD              <$> arbitrary <*> arbitrary
@@ -158,6 +196,9 @@
 #if MIN_VERSION_template_haskell(2,10,0)
                       , pure $ StaticE fExp
 #endif
+#if MIN_VERSION_template_haskell(2,11,0)
+                      , UnboundVarE <$> arbitrary
+#endif
                       ]
 --     arbitrary = oneof [ VarE        <$> arbitrary
 --                       , ConE        <$> arbitrary
@@ -229,11 +270,26 @@
 #else
           pure $ ClassI fDec
 #endif
-        , ClassOpI   <$> arbitrary <*> arbitrary <*> arbitrary <*> arbitrary
+        , ClassOpI   <$> arbitrary
+                     <*> arbitrary
+                     <*> arbitrary
+#if !(MIN_VERSION_template_haskell(2,11,0))
+                     <*> arbitrary
+#endif
         , pure $ TyConI fDec
         , PrimTyConI <$> arbitrary <*> arbitrary <*> arbitrary
-        , DataConI   <$> arbitrary <*> arbitrary <*> arbitrary <*> arbitrary
-        , VarI       <$> arbitrary <*> arbitrary <*> arbitrary <*> arbitrary
+        , DataConI   <$> arbitrary
+                     <*> arbitrary
+                     <*> arbitrary
+#if !(MIN_VERSION_template_haskell(2,11,0))
+                     <*> arbitrary
+#endif
+        , VarI       <$> arbitrary
+                     <*> arbitrary
+                     <*> arbitrary
+#if !(MIN_VERSION_template_haskell(2,11,0))
+                     <*> arbitrary
+#endif
         , TyVarI     <$> arbitrary <*> arbitrary
 #if MIN_VERSION_template_haskell(2,7,0)
         , pure $ FamilyI fDec [fDec]
@@ -268,6 +324,9 @@
 #if MIN_VERSION_template_haskell(2,5,0)
                       , StringPrimL <$> arbitrary
 #endif
+#if MIN_VERSION_template_haskell(2,11,0)
+                      , CharPrimL   <$> arbitrary
+#endif
                       ]
 
 instance Arbitrary Loc where
@@ -403,11 +462,6 @@
 --                       , ParS    <$> arbitrary
 --                       ]
 
-deriving instance Bounded Strict
-deriving instance Enum Strict
-instance Arbitrary Strict where
-    arbitrary = arbitraryBoundedEnum
-
 instance Arbitrary Type where
     arbitrary = oneof [ pure $ ForallT [fTyVarBndr] [fPred] fType
                       , VarT <$> arbitrary
@@ -432,6 +486,12 @@
 #if MIN_VERSION_template_haskell(2,10,0)
                       , pure EqualityT
 #endif
+#if MIN_VERSION_template_haskell(2,11,0)
+                      , InfixT  fType <$> arbitrary <@> fType
+                      , UInfixT fType <$> arbitrary <@> fType
+                      , pure $ ParensT fType
+                      , pure WildCardT
+#endif
                       ]
 --     arbitrary = oneof [ ForallT        <$> arbitrary <*> arbitrary <*> arbitrary
 --                       , VarT           <$> arbitrary
@@ -511,7 +571,7 @@
 
 instance Arbitrary Module where
     arbitrary = Module <$> arbitrary <*> arbitrary
-                      
+
 instance Arbitrary ModuleInfo where
     arbitrary = ModuleInfo <$> arbitrary
 
@@ -535,6 +595,46 @@
 --     arbitrary = oneof [ ClassP <$> arbitrary <*> arbitrary
 --                       , EqualP <$> arbitrary <*> arbitrary
 --                       ]
+#endif
+
+#if MIN_VERSION_template_haskell(2,11,0)
+instance Arbitrary Bang where
+    arbitrary = Bang <$> arbitrary <*> arbitrary
+
+deriving instance Bounded DecidedStrictness
+deriving instance Enum DecidedStrictness
+instance Arbitrary DecidedStrictness where
+    arbitrary = arbitraryBoundedEnum
+
+instance Arbitrary FamilyResultSig where
+    arbitrary = oneof [ pure NoSig
+                      , pure $ KindSig fKind
+                      , pure $ TyVarSig fTyVarBndr
+                      ]
+
+instance Arbitrary InjectivityAnn where
+    arbitrary = pure $ InjectivityAnn fName [fName]
+
+deriving instance Bounded SourceStrictness
+deriving instance Enum SourceStrictness
+instance Arbitrary SourceStrictness where
+    arbitrary = arbitraryBoundedEnum
+
+deriving instance Bounded SourceUnpackedness
+deriving instance Enum SourceUnpackedness
+instance Arbitrary SourceUnpackedness where
+    arbitrary = arbitraryBoundedEnum
+
+instance Arbitrary TypeFamilyHead where
+    arbitrary = TypeFamilyHead fName
+                               [fTyVarBndr]
+                           <$> arbitrary
+                           <*> arbitrary
+#else
+deriving instance Bounded Strict
+deriving instance Enum Strict
+instance Arbitrary Strict where
+    arbitrary = arbitraryBoundedEnum
 #endif
 
 deriving instance Arbitrary ModName
diff --git a/tests/Instances/Text/PrettyPrint.hs b/tests/Instances/Text/PrettyPrint.hs
--- a/tests/Instances/Text/PrettyPrint.hs
+++ b/tests/Instances/Text/PrettyPrint.hs
@@ -15,15 +15,21 @@
 -}
 module Instances.Text.PrettyPrint () where
 
-import Prelude ()
-import Prelude.Compat
+import           Prelude ()
+import           Prelude.Compat
 
-import Test.QuickCheck (Arbitrary(..), arbitraryBoundedEnum, oneof)
+import           Test.QuickCheck (Arbitrary(..), arbitraryBoundedEnum, oneof)
 
-import Text.PrettyPrint.HughesPJ (Doc, Mode(..), Style(..), TextDetails(..), text)
+import           Text.PrettyPrint.HughesPJ (Doc, Mode(..), Style(..),
+                                            TextDetails(..), text)
 #if MIN_VERSION_pretty(1,1,2)
-import Text.PrettyPrint.HughesPJClass (PrettyLevel(..))
+import           Text.PrettyPrint.HughesPJClass (PrettyLevel(..))
 #endif
+#if MIN_VERSION_pretty(1,1,3)
+import qualified Text.PrettyPrint.Annotated.HughesPJ as Annot (Doc, text)
+import           Text.PrettyPrint.Annotated.HughesPJ (AnnotDetails(..), Span(..))
+import qualified Text.PrettyPrint.Annotated.HughesPJClass as Annot (PrettyLevel(..))
+#endif
 
 instance Arbitrary Doc where
     arbitrary = text <$> arbitrary
@@ -45,4 +51,20 @@
 deriving instance Show Mode
 deriving instance Show Style
 deriving instance Show TextDetails
+#endif
+
+#if MIN_VERSION_pretty(1,1,3)
+instance Arbitrary a => Arbitrary (AnnotDetails a) where
+    arbitrary = oneof [ pure AnnotStart
+                      , NoAnnot <$> arbitrary <*> arbitrary
+                      , AnnotEnd <$> arbitrary
+                      ]
+
+instance Arbitrary (Annot.Doc a) where
+    arbitrary = Annot.text <$> arbitrary
+
+deriving instance Arbitrary Annot.PrettyLevel
+
+instance Arbitrary a => Arbitrary (Span a) where
+    arbitrary = Span <$> arbitrary <*> arbitrary <*> arbitrary
 #endif
diff --git a/tests/Spec/Data/BifunctorSpec.hs b/tests/Spec/Data/BifunctorSpec.hs
--- a/tests/Spec/Data/BifunctorSpec.hs
+++ b/tests/Spec/Data/BifunctorSpec.hs
@@ -12,6 +12,7 @@
 
 import Data.Bifunctor.Biff (Biff)
 import Data.Bifunctor.Clown (Clown)
+import Data.Bifunctor.Fix (Fix)
 import Data.Bifunctor.Flip (Flip)
 import Data.Bifunctor.Join (Join)
 import Data.Bifunctor.Joker (Joker)
@@ -37,6 +38,8 @@
         prop "TextShow instance" (prop_matchesTextShow :: Int -> Biff Either [] Maybe Char Int -> Bool)
     describe "Clown [] Char Int" $
         prop "TextShow instance" (prop_matchesTextShow :: Int -> Clown [] Char Int -> Bool)
+    describe "Fix Either Int" $
+        prop "TextShow instance" (prop_matchesTextShow :: Int -> Fix Either Int -> Bool)
     describe "Flip Either Int Char" $
         prop "TextShow instance" (prop_matchesTextShow :: Int -> Flip Either Int Char -> Bool)
     describe "Join Either Int" $
diff --git a/tests/Spec/Data/List/NonEmptySpec.hs b/tests/Spec/Data/List/NonEmptySpec.hs
deleted file mode 100644
--- a/tests/Spec/Data/List/NonEmptySpec.hs
+++ /dev/null
@@ -1,31 +0,0 @@
-{-|
-Module:      Spec.Data.List.NonEmptySpec
-Copyright:   (C) 2014-2015 Ryan Scott
-License:     BSD-style (see the file LICENSE)
-Maintainer:  Ryan Scott
-Stability:   Provisional
-Portability: GHC
-
-@hspec@ tests for 'NonEmpty' lists.
--}
-module Spec.Data.List.NonEmptySpec (main, spec) where
-
-import Data.List.NonEmpty (NonEmpty)
-
-import Instances.Data.List.NonEmpty ()
-
-import Spec.Utils (prop_matchesTextShow, prop_genericTextShow, prop_genericTextShow1)
-
-import Test.Hspec (Spec, describe, hspec, parallel)
-import Test.Hspec.QuickCheck (prop)
-
-import TextShow.Data.List.NonEmpty ()
-
-main :: IO ()
-main = hspec spec
-
-spec :: Spec
-spec = parallel . describe "NonEmpty Char" $ do
-    prop "TextShow instance" (prop_matchesTextShow  :: Int -> NonEmpty Char -> Bool)
-    prop "generic TextShow"  (prop_genericTextShow  :: Int -> NonEmpty Char -> Bool)
-    prop "generic TextShow1" (prop_genericTextShow1 :: Int -> NonEmpty Char -> Bool)
diff --git a/tests/Spec/Data/SemigroupSpec.hs b/tests/Spec/Data/SemigroupSpec.hs
deleted file mode 100644
--- a/tests/Spec/Data/SemigroupSpec.hs
+++ /dev/null
@@ -1,56 +0,0 @@
-{-|
-Module:      Spec.Data.SemigroupSpec
-Copyright:   (C) 2014-2015 Ryan Scott
-License:     BSD-style (see the file LICENSE)
-Maintainer:  Ryan Scott
-Stability:   Provisional
-Portability: GHC
-
-@hspec@ tests for @Semigroup@ data types.
--}
-module Spec.Data.SemigroupSpec (main, spec) where
-
-import Data.Semigroup (Min, Max, First, Last, WrappedMonoid, Option, Arg)
-
-import Instances.Data.Semigroup ()
-
-import Spec.Utils (prop_matchesTextShow, prop_genericTextShow, prop_genericTextShow1)
-
-import Test.Hspec (Spec, describe, hspec, parallel)
-import Test.Hspec.QuickCheck (prop)
-
-import TextShow.Data.Semigroup ()
-
-main :: IO ()
-main = hspec spec
-
-spec :: Spec
-spec = parallel $ do
-    describe "Min Int" $ do
-        prop "TextShow instance" (prop_matchesTextShow  :: Int -> Min Int -> Bool)
-        prop "generic TextShow"  (prop_genericTextShow  :: Int -> Min Int -> Bool)
-        prop "generic TextShow1" (prop_genericTextShow1 :: Int -> Min Int -> Bool)
-    describe "Max Int" $ do
-        prop "TextShow instance" (prop_matchesTextShow  :: Int -> Max Int -> Bool)
-        prop "generic TextShow"  (prop_genericTextShow  :: Int -> Max Int -> Bool)
-        prop "generic TextShow1" (prop_genericTextShow1 :: Int -> Max Int -> Bool)
-    describe "First Int" $ do
-        prop "TextShow instance" (prop_matchesTextShow  :: Int -> First Int -> Bool)
-        prop "generic TextShow"  (prop_genericTextShow  :: Int -> First Int -> Bool)
-        prop "generic TextShow1" (prop_genericTextShow1 :: Int -> First Int -> Bool)
-    describe "Last Int" $ do
-        prop "TextShow instance" (prop_matchesTextShow  :: Int -> Last Int -> Bool)
-        prop "generic TextShow"  (prop_genericTextShow  :: Int -> Last Int -> Bool)
-        prop "generic TextShow1" (prop_genericTextShow1 :: Int -> Last Int -> Bool)
-    describe "WrappedMonoid Int" $ do
-        prop "TextShow instance" (prop_matchesTextShow  :: Int -> WrappedMonoid Int -> Bool)
-        prop "generic TextShow"  (prop_genericTextShow  :: Int -> WrappedMonoid Int -> Bool)
-        prop "generic TextShow1" (prop_genericTextShow1 :: Int -> WrappedMonoid Int -> Bool)
-    describe "Option Int" $ do
-        prop "TextShow instance" (prop_matchesTextShow  :: Int -> Option Int -> Bool)
-        prop "generic TextShow"  (prop_genericTextShow  :: Int -> Option Int -> Bool)
-        prop "generic TextShow1" (prop_genericTextShow1 :: Int -> Option Int -> Bool)
-    describe "Arg Int Int" $ do
-        prop "TextShow instance" (prop_matchesTextShow  :: Int -> Arg Int Int -> Bool)
-        prop "generic TextShow"  (prop_genericTextShow  :: Int -> Arg Int Int -> Bool)
-        prop "generic TextShow1" (prop_genericTextShow1 :: Int -> Arg Int Int -> Bool)
diff --git a/tests/Spec/Language/Haskell/THSpec.hs b/tests/Spec/Language/Haskell/THSpec.hs
--- a/tests/Spec/Language/Haskell/THSpec.hs
+++ b/tests/Spec/Language/Haskell/THSpec.hs
@@ -38,6 +38,11 @@
         prop "TextShow instance"               (prop_matchesTextShow :: Int -> AnnTarget -> Bool)
         prop "generic TextShow"                (prop_genericTextShow :: Int -> AnnTarget -> Bool)
 #endif
+#if MIN_VERSION_template_haskell(2,11,0)
+    describe "Bang" $ do
+        prop "TextShow instance"               (prop_matchesTextShow :: Int -> Bang -> Bool)
+        prop "generic TextShow"                (prop_genericTextShow :: Int -> Bang -> Bool)
+#endif
     describe "Body" $ do
         prop "TextShow instance"               (prop_matchesTextShow :: Int -> Body -> Bool)
         prop "generic TextShow"                (prop_genericTextShow :: Int -> Body -> Bool)
@@ -58,6 +63,11 @@
     describe "Dec" $ do
         prop "TextShow instance"               (prop_matchesTextShow :: Int -> Dec -> Bool)
         prop "generic TextShow"                (prop_genericTextShow :: Int -> Dec -> Bool)
+#if MIN_VERSION_template_haskell(2,11,0)
+    describe "DecidedStrictness" $ do
+        prop "TextShow instance"               (prop_matchesTextShow :: Int -> DecidedStrictness -> Bool)
+        prop "generic TextShow"                (prop_genericTextShow :: Int -> DecidedStrictness -> Bool)
+#endif
     describe "Doc" $
         prop "TextShow instance"               (prop_matchesTextShow :: Int -> Doc -> Bool)
     describe "Exp" $ do
@@ -66,6 +76,11 @@
     describe "FamFlavour" $ do
         prop "TextShow instance"               (prop_matchesTextShow :: Int -> FamFlavour -> Bool)
         prop "generic TextShow"                (prop_genericTextShow :: Int -> FamFlavour -> Bool)
+#if MIN_VERSION_template_haskell(2,11,0)
+    describe "FamilyResultSig" $ do
+        prop "TextShow instance"               (prop_matchesTextShow :: Int -> FamilyResultSig -> Bool)
+        prop "generic TextShow"                (prop_genericTextShow :: Int -> FamilyResultSig -> Bool)
+#endif
     describe "Fixity" $ do
         prop "TextShow instance"               (prop_matchesTextShow :: Int -> Fixity -> Bool)
         prop "generic TextShow"                (prop_genericTextShow :: Int -> Fixity -> Bool)
@@ -84,6 +99,11 @@
     describe "Info" $ do
         prop "TextShow instance"               (prop_matchesTextShow :: Int -> Info -> Bool)
         prop "generic TextShow"                (prop_genericTextShow :: Int -> Info -> Bool)
+#if MIN_VERSION_template_haskell(2,11,0)
+    describe "InjectivityAnn" $ do
+        prop "TextShow instance"               (prop_matchesTextShow :: Int -> InjectivityAnn -> Bool)
+        prop "generic TextShow"                (prop_genericTextShow :: Int -> InjectivityAnn -> Bool)
+#endif
 #if MIN_VERSION_template_haskell(2,8,0)
     describe "Inline" $ do
         prop "TextShow instance"               (prop_matchesTextShow :: Int -> Inline -> Bool)
@@ -159,6 +179,14 @@
     describe "Safety" $ do
         prop "TextShow instance"               (prop_matchesTextShow :: Int -> Safety -> Bool)
         prop "generic TextShow"                (prop_genericTextShow :: Int -> Safety -> Bool)
+#if MIN_VERSION_template_haskell(2,11,0)
+    describe "SourceStrictness" $ do
+        prop "TextShow instance"               (prop_matchesTextShow :: Int -> SourceStrictness -> Bool)
+        prop "generic TextShow"                (prop_genericTextShow :: Int -> SourceStrictness -> Bool)
+    describe "SourceUnpackedness" $ do
+        prop "TextShow instance"               (prop_matchesTextShow :: Int -> SourceUnpackedness -> Bool)
+        prop "generic TextShow"                (prop_genericTextShow :: Int -> SourceUnpackedness -> Bool)
+#endif
     describe "Stmt" $ do
         prop "TextShow instance"               (prop_matchesTextShow :: Int -> Stmt -> Bool)
         prop "generic TextShow"                (prop_genericTextShow :: Int -> Stmt -> Bool)
@@ -173,6 +201,11 @@
     describe "Type" $ do
         prop "TextShow instance"               (prop_matchesTextShow :: Int -> Type -> Bool)
         prop "generic TextShow"                (prop_genericTextShow :: Int -> Type -> Bool)
+#if MIN_VERSION_template_haskell(2,11,0)
+    describe "TypeFamilyHead" $ do
+        prop "TextShow instance"               (prop_matchesTextShow :: Int -> TypeFamilyHead -> Bool)
+        prop "generic TextShow"                (prop_genericTextShow :: Int -> TypeFamilyHead -> Bool)
+#endif
 #if MIN_VERSION_template_haskell(2,9,0)
     describe "TySynEqn" $ do
         prop "TextShow instance"               (prop_matchesTextShow :: Int -> TySynEqn -> Bool)
diff --git a/tests/Spec/Text/PrettyPrintSpec.hs b/tests/Spec/Text/PrettyPrintSpec.hs
--- a/tests/Spec/Text/PrettyPrintSpec.hs
+++ b/tests/Spec/Text/PrettyPrintSpec.hs
@@ -11,22 +11,27 @@
 -}
 module Spec.Text.PrettyPrintSpec (main, spec) where
 
-import Instances.Text.PrettyPrint ()
+import           Instances.Text.PrettyPrint ()
 
-import Spec.Utils (prop_matchesTextShow)
+import           Spec.Utils (prop_matchesTextShow)
 #if MIN_VERSION_pretty(1,1,2)
-import Spec.Utils (prop_genericTextShow)
+import           Spec.Utils (prop_genericTextShow)
 #endif
 
-import Test.Hspec (Spec, describe, hspec, parallel)
-import Test.Hspec.QuickCheck (prop)
+import           Test.Hspec (Spec, describe, hspec, parallel)
+import           Test.Hspec.QuickCheck (prop)
 
-import Text.PrettyPrint.HughesPJ (Doc, Mode, Style, TextDetails {-, renderStyle -})
+import           Text.PrettyPrint.HughesPJ (Doc, Mode, Style, TextDetails {-, renderStyle -})
 #if MIN_VERSION_pretty(1,1,2)
-import Text.PrettyPrint.HughesPJClass (PrettyLevel)
+import           Text.PrettyPrint.HughesPJClass (PrettyLevel)
 #endif
--- import TextShow (fromString)
-import TextShow.Text.PrettyPrint () -- (renderStyleB)
+#if MIN_VERSION_pretty(1,1,3)
+import qualified Text.PrettyPrint.Annotated.HughesPJ as Annot (Doc)
+import           Text.PrettyPrint.Annotated.HughesPJ (AnnotDetails, Span)
+import qualified Text.PrettyPrint.Annotated.HughesPJClass as Annot (PrettyLevel)
+#endif
+-- import           TextShow (fromString)
+import           TextShow.Text.PrettyPrint () -- (renderStyleB)
 
 main :: IO ()
 main = hspec spec
@@ -56,6 +61,16 @@
 #if MIN_VERSION_pretty(1,1,2)
     describe "PrettyLevel" $
         prop "TextShow instance"                 (prop_matchesTextShow :: Int -> PrettyLevel -> Bool)
+#endif
+#if MIN_VERSION_pretty(1,1,3)
+    describe "AnnotDetails Int" $
+        prop "TextShow instance"                 (prop_matchesTextShow :: Int -> AnnotDetails Int -> Bool)
+    describe "Doc Int (annotated)" $
+        prop "TextShow instance"                 (prop_matchesTextShow :: Int -> Annot.Doc Int -> Bool)
+    describe "PrettyLevel (annotated)" $
+        prop "TextShow instance"                 (prop_matchesTextShow :: Int -> Annot.PrettyLevel -> Bool)
+    describe "Span Int" $
+        prop "TextShow instance"                 (prop_matchesTextShow :: Int -> Span Int -> Bool)
 #endif
 
 -- | Verifies that the output of 'renderStyle' and 'renderStyleB' coincides.
diff --git a/tests/Spec/Utils.hs b/tests/Spec/Utils.hs
--- a/tests/Spec/Utils.hs
+++ b/tests/Spec/Utils.hs
@@ -9,58 +9,72 @@
 Stability:   Provisional
 Portability: GHC
 
-@QuickCheck@ property-related utility functions.
+Testing-related utility functions.
 -}
 module Spec.Utils (
-      prop_matchesTextShow
+      ioProperty
+    , prop_matchesTextShow
+    , prop_matchesTextShow1
+#if !(MIN_VERSION_transformers(0,4,0)) || MIN_VERSION_transformers(0,5,0)
+    , prop_matchesTextShow2
+#endif
     , prop_genericTextShow
     , prop_genericTextShow1
     ) where
 
-#if __GLASGOW_HASKELL__ >= 704
-import GHC.Generics (Generic, Rep)
-# if __GLASGOW_HASKELL__ >= 706
-import GHC.Generics (Generic1, Rep1)
-# endif
-import TextShow.Generic
+import           Data.Functor.Classes (Show1, showsPrec1)
+
+import           Generics.Deriving.Base
+
+#if MIN_VERSION_QuickCheck(2,7,0)
+import qualified Test.QuickCheck as QC (ioProperty)
+#else
+import           Test.QuickCheck (morallyDubiousIOProperty)
 #endif
+import           Test.QuickCheck (Property, Testable)
 
-import TextShow (TextShow(..), FromStringShow(..))
-#if __GLASGOW_HASKELL__ >= 706
-import TextShow (TextShow1(..), Builder)
+import           TextShow (TextShow(..), TextShow1(..), showbPrec1, fromString)
+import           TextShow.Generic
+
+#if !(MIN_VERSION_transformers(0,4,0)) || MIN_VERSION_transformers(0,5,0)
+import           Data.Functor.Classes (Show2, showsPrec2)
+import           TextShow (TextShow2(..), showbPrec2)
 #endif
 
+ioProperty :: Testable prop => IO prop -> Property
+#if MIN_VERSION_QuickCheck(2,7,0)
+ioProperty = QC.ioProperty
+#else
+ioProperty = morallyDubiousIOProperty
+#endif
+
 -- | 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 = showbPrec p (FromStringShow x) == showbPrec p x
+prop_matchesTextShow p x = fromString (showsPrec p x "") == showbPrec p x
 
+-- | 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
+
+#if !(MIN_VERSION_transformers(0,4,0)) || MIN_VERSION_transformers(0,5,0)
+-- | 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
+#endif
+
 -- | Verifies that a type's 'TextShow' instance coincides with the output produced
 -- by the equivalent 'Generic' functions.
-#if __GLASGOW_HASKELL__ >= 704
 prop_genericTextShow :: (TextShow a, Generic a, GTextShow (Rep a))
                      => Int -> a -> Bool
 prop_genericTextShow p x = showbPrec p x == genericShowbPrec p x
-#else
-prop_genericTextShow :: Int -> a -> Bool
-prop_genericTextShow _ _ = True
-#endif
 
 -- | Verifies that a type's 'TextShow1' instance coincides with the output produced
 -- by the equivalent 'Generic1' functions.
-#if __GLASGOW_HASKELL__ >= 706
-prop_genericTextShow1 :: (TextShow1 f, Generic1 f, GTextShow1 (Rep1 f))
+prop_genericTextShow1 :: (TextShow1 f, Generic1 f, GTextShow1 (Rep1 f), TextShow a)
                       => Int -> f a -> Bool
-prop_genericTextShow1 p x = showbPrecWith showb27Prec p x
-                            == genericShowbPrecWith showb27Prec p x
-#else
-prop_genericTextShow1 :: Int -> f a -> Bool
-prop_genericTextShow1 _ _ = True
-#endif
-
-#if __GLASGOW_HASKELL__ >= 706
--- | Show the number 27, which certain parody singer-songwriters find humorous.
--- Useful for testing higher-order 'TextShow' classes.
-showb27Prec :: Int -> a -> Builder
-showb27Prec p _ = showbPrec p $ Just (27 :: Int)
-#endif
+prop_genericTextShow1 p x =
+    showbPrec1 p x == genericLiftShowbPrec showbPrec showbList p x
diff --git a/text-show-instances.cabal b/text-show-instances.cabal
--- a/text-show-instances.cabal
+++ b/text-show-instances.cabal
@@ -1,5 +1,5 @@
 name:                text-show-instances
-version:             2.1
+version:             3
 synopsis:            Additional instances for text-show
 description:         @text-show-instances@ is a supplemental library to @text-show@
                      that provides additional @Show@ instances for data types in
@@ -60,7 +60,7 @@
 license:             BSD3
 license-file:        LICENSE
 author:              Ryan Scott
-maintainer:          Ryan Scott <ryan.gl.scott@ku.edu>
+maintainer:          Ryan Scott <ryan.gl.scott@gmail.com>
 stability:           Experimental
 copyright:           (C) 2014-2015 Ryan Scott
 category:            Text
@@ -70,7 +70,8 @@
                    , GHC == 7.4.2
                    , GHC == 7.6.3
                    , GHC == 7.8.4
-                   , GHC == 7.10.1
+                   , GHC == 7.10.3
+                   , GHC == 8.0.1
 extra-source-files:  CHANGELOG.md, README.md, include/inline.h
 cabal-version:       >=1.10
 
@@ -78,6 +79,11 @@
   type:                git
   location:            https://github.com/RyanGlScott/text-show-instances
 
+flag developer
+  description:         Operate in developer mode (allows for faster recompilation of tests)
+  default:             False
+  manual:              True
+
 library
   exposed-modules:     TextShow.Instances
 
@@ -88,8 +94,6 @@
                        TextShow.Data.Binary
                        TextShow.Data.Containers
                        TextShow.Data.Functor.Trans
-                       TextShow.Data.List.NonEmpty
-                       TextShow.Data.Semigroup
                        TextShow.Data.Tagged
                        TextShow.Data.Time
                        TextShow.Data.UnorderedContainers
@@ -113,8 +117,8 @@
   other-modules:       TextShow.Utils
   build-depends:       base                 >= 4.3    && < 5
                      , base-compat          >= 0.8.1  && < 1
-                     , bifunctors           >= 5      && < 6
-                     , binary               >= 0.6    && < 0.8
+                     , bifunctors           >= 5.1    && < 6
+                     , binary               >= 0.6    && < 0.9
                      , bytestring           >= 0.9    && < 0.11
                      , containers           >= 0.1    && < 0.6
                      , directory            >= 1      && < 1.3
@@ -129,10 +133,10 @@
                      , tagged               >= 0.4.4  && < 1
                      , template-haskell     >= 2.5    && < 2.12
                      , text                 >= 0.11.1 && < 1.3
-                     , text-show            >= 2      && < 2.2
-                     , time                 >= 0.1    && < 1.6
-                     , transformers         >= 0.2.1  && < 0.5
-                     , transformers-compat  >= 0.3    && < 1
+                     , text-show            >= 3      && < 4
+                     , time                 >= 0.1    && < 1.7
+                     , transformers         >= 0.2.1  && < 0.6
+                     , transformers-compat  >= 0.5    && < 1
                      , unordered-containers >= 0.2    && < 0.3
                      , vector               >= 0.9    && < 0.12
                      , xhtml                >= 3000.2 && < 3000.3
@@ -159,8 +163,6 @@
                        Instances.Data.Binary
                        Instances.Data.Containers
                        Instances.Data.Functor.Trans
-                       Instances.Data.List.NonEmpty
-                       Instances.Data.Semigroup
                        Instances.Data.Tagged
                        Instances.Language.Haskell.TH
                        Instances.Miscellaneous
@@ -187,8 +189,6 @@
                        Spec.Data.BinarySpec
                        Spec.Data.ContainersSpec
                        Spec.Data.Functor.TransSpec
-                       Spec.Data.List.NonEmptySpec
-                       Spec.Data.SemigroupSpec
                        Spec.Data.TaggedSpec
                        Spec.Data.TimeSpec
                        Spec.Data.UnorderedContainersSpec
@@ -211,11 +211,12 @@
                        Spec.System.PosixSpec
   build-depends:       base                 >= 4.3    && < 5
                      , base-compat          >= 0.8.1  && < 1
-                     , bifunctors           >= 5      && < 6
-                     , binary               >= 0.6    && < 0.8
+                     , bifunctors           >= 5.1    && < 6
+                     , binary               >= 0.6    && < 0.9
                      , bytestring           >= 0.9    && < 0.11
                      , containers           >= 0.1    && < 0.6
                      , directory            >= 1      && < 1.3
+                     , generic-deriving     >= 1.9    && < 2
                      , ghc-prim
                      , haskeline            >= 0.7    && < 0.8
                      , hoopl                >= 3.8.7  && < 3.11
@@ -227,21 +228,30 @@
                      , QuickCheck           >= 2.5    && < 3
                      , quickcheck-instances >= 0.1    && < 0.4
                      , random               >= 1.0.1  && < 1.2
-                     , semigroups           >= 0.8.4  && < 1
+                     , semigroups           >= 0.17   && < 1
                      , tagged               >= 0.4.4  && < 1
                      , template-haskell     >= 2.5    && < 2.12
-                     , text-show            >= 2      && < 2.2
-                     , text-show-instances  == 2.1
+                     , text                 >= 0.11.1 && < 1.3
+                     , text-show            >= 3      && < 4
                      , th-orphans           >= 0.12   && < 1
-                     , time                 >= 0.1    && < 1.6
-                     , transformers         >= 0.2.1  && < 0.5
-                     , transformers-compat  >= 0.3    && < 1
+                     , time                 >= 0.1    && < 1.7
+                     , transformers         >= 0.2.1  && < 0.6
+                     , transformers-compat  >= 0.5    && < 1
                      , unordered-containers >= 0.2    && < 0.3
                      , vector               >= 0.9    && < 0.12
                      , xhtml                >= 3000.2 && < 3000.3
+  if !flag(developer)
+    build-depends:     text-show-instances  == 3
+
   hs-source-dirs:      tests
+  if flag(developer)
+    hs-source-dirs:    src
+
   default-language:    Haskell2010
   ghc-options:         -Wall -threaded -rtsopts
+  include-dirs:        include
+  includes:            inline.h
+  install-includes:    inline.h
 
   if os(windows)
     build-depends:     Win32                >= 2.1    && < 2.4
