diff --git a/Changelog.md b/Changelog.md
--- a/Changelog.md
+++ b/Changelog.md
@@ -1,3 +1,9 @@
+# 0.1.2
+
+- Fix build with GHC 9.8
+- Add `PPGeneric` newtype to apply `ppGeneric` through `DerivingVia`
+- Add `PPShow` newtype to apply `ppShow` through `DerivingVia`
+
 # 0.1.1.1
 - `ppVector` and `ppVectorWith` now accept generic vectors
 - Add lower bound `pretty-show >= 1.6`
diff --git a/Readme.md b/Readme.md
--- a/Readme.md
+++ b/Readme.md
@@ -1,3 +1,5 @@
+[![build](https://github.com/sergv/prettyprinter-combinators/actions/workflows/haskell-ci.yaml/badge.svg)](https://github.com/sergv/prettyprinter-combinators/actions/workflows/haskell-ci.yaml)
+
 This is a set of utilities for the Haskell `prettyrinter` package.
 Most notable is automatic deriving of `Pretty` instance from the
 `Generic` instance, e.g.
diff --git a/prettyprinter-combinators.cabal b/prettyprinter-combinators.cabal
--- a/prettyprinter-combinators.cabal
+++ b/prettyprinter-combinators.cabal
@@ -3,7 +3,7 @@
 name:
   prettyprinter-combinators
 version:
-  0.1.1.1
+  0.1.2
 synopsis:
   Some useful combinators for the prettyprinter package
 description:
@@ -25,10 +25,10 @@
   Sergey Vinokurov <serg.foo@gmail.com>
 
 tested-with:
-  , GHC == 8.10.7
-  , GHC == 9.0.2
-  , GHC == 9.2.5
-  , GHC == 9.4.4
+  , GHC == 9.2.8
+  , GHC == 9.4.7
+  , GHC == 9.6.3
+  , GHC == 9.8.1
 
 build-type:
   Simple
@@ -44,21 +44,18 @@
 
 common ghc-options
   default-language:
-    Haskell2010
-
-  default-extensions:
-    ImportQualifiedPost
+    GHC2021
 
   ghc-options:
     -Weverything
-    -Wno-type-defaults
+    -Wno-all-missed-specialisations
     -Wno-implicit-prelude
-    -Wno-missing-local-signatures
-    -Wno-missing-import-lists
     -Wno-missed-specialisations
-    -Wno-all-missed-specialisations
-    -Wno-safe
+    -Wno-missing-import-lists
+    -Wno-missing-local-signatures
     -Wno-missing-safe-haskell-mode
+    -Wno-safe
+    -Wno-type-defaults
     -Wno-unsafe
 
   if impl(ghc >= 8.8)
@@ -69,6 +66,11 @@
     ghc-options:
       -Wno-missing-kind-signatures
 
+  if impl(ghc >= 9.8)
+    ghc-options:
+      -Wno-missing-role-annotations
+      -Wno-missing-poly-kind-signatures
+
 library
   import: ghc-options
   exposed-modules:
@@ -82,7 +84,7 @@
   hs-source-dirs:
     src
   build-depends:
-    , base >= 4.14 && <5
+    , base >= 4.16 && <5
     , bimap
     , bytestring
     , containers
@@ -90,7 +92,7 @@
     , pretty-show >= 1.6
     , prettyprinter >= 1.7
     , syb
-    , template-haskell >= 2.10
+    , template-haskell >= 2.18
     , text
     , unordered-containers
     , vector
diff --git a/src/Prettyprinter/Combinators.hs b/src/Prettyprinter/Combinators.hs
--- a/src/Prettyprinter/Combinators.hs
+++ b/src/Prettyprinter/Combinators.hs
@@ -6,10 +6,8 @@
 -- Maintainer  :  serg.foo@gmail.com
 ----------------------------------------------------------------------------
 
-{-# LANGUAGE CPP                 #-}
-{-# LANGUAGE DeriveTraversable   #-}
-{-# LANGUAGE OverloadedStrings   #-}
-{-# LANGUAGE ScopedTypeVariables #-}
+{-# LANGUAGE CPP               #-}
+{-# LANGUAGE OverloadedStrings #-}
 
 module Prettyprinter.Combinators
   ( Pretty(..)
diff --git a/src/Prettyprinter/Combinators/Basic.hs b/src/Prettyprinter/Combinators/Basic.hs
--- a/src/Prettyprinter/Combinators/Basic.hs
+++ b/src/Prettyprinter/Combinators/Basic.hs
@@ -6,8 +6,7 @@
 -- Maintainer  :  serg.foo@gmail.com
 ----------------------------------------------------------------------------
 
-{-# LANGUAGE OverloadedStrings   #-}
-{-# LANGUAGE ScopedTypeVariables #-}
+{-# LANGUAGE OverloadedStrings #-}
 
 module Prettyprinter.Combinators.Basic
   ( (##)
diff --git a/src/Prettyprinter/Data.hs b/src/Prettyprinter/Data.hs
--- a/src/Prettyprinter/Data.hs
+++ b/src/Prettyprinter/Data.hs
@@ -125,6 +125,7 @@
 ppData :: Data a => a -> Doc ann
 ppData = mdPayload . gpretty
 
+-- | Prettyprint using 'Data.Generics.gshow'.
 ppDataSimple :: Data a => a -> Doc ann
 ppDataSimple = pretty . Data.Generics.gshow
 
diff --git a/src/Prettyprinter/Generics.hs b/src/Prettyprinter/Generics.hs
--- a/src/Prettyprinter/Generics.hs
+++ b/src/Prettyprinter/Generics.hs
@@ -8,18 +8,15 @@
 
 {-# LANGUAGE CPP                  #-}
 {-# LANGUAGE DataKinds            #-}
-{-# LANGUAGE FlexibleContexts     #-}
-{-# LANGUAGE FlexibleInstances    #-}
 {-# LANGUAGE LambdaCase           #-}
 {-# LANGUAGE OverloadedStrings    #-}
-{-# LANGUAGE ScopedTypeVariables  #-}
 {-# LANGUAGE TypeApplications     #-}
 {-# LANGUAGE TypeFamilies         #-}
-{-# LANGUAGE TypeOperators        #-}
 {-# LANGUAGE UndecidableInstances #-}
 
 module Prettyprinter.Generics
   ( ppGeneric
+  , PPGeneric(..)
   , PPGenericOverride(..)
   , Pretty(..)
   , Generic
@@ -56,10 +53,6 @@
 import GHC.Stack (CallStack)
 import GHC.TypeLits
 
-#if !MIN_VERSION_GLASGOW_HASKELL(9, 2, 0, 0)
-import Numeric.Natural
-#endif
-
 import Prettyprinter
 import Prettyprinter.Combinators
 import Prettyprinter.MetaDoc
@@ -69,6 +62,7 @@
 
 -- $setup
 -- >>> :set -XDeriveGeneric
+-- >>> :set -XDerivingVia
 -- >>> :set -XImportQualifiedPost
 -- >>> import Data.List.NonEmpty (NonEmpty(..))
 -- >>> import Data.List.NonEmpty qualified as NonEmpty
@@ -96,9 +90,27 @@
 --   } deriving (Generic)
 -- :}
 
--- | Prettyprint using 'Generic.Data' instance.
+-- | Helper to use 'GHC.Generics.Generic'-based prettyprinting with DerivingVia.
 --
 -- >>> :{
+-- data TestWithDeriving a b = TestWithDeriving
+--   { testSet         :: Maybe (Set a)
+--   , testB           :: b
+--   , testIntMap      :: IntMap String
+--   , testComplexMap  :: Map (Maybe (Set Int)) (IntMap (Set String))
+--   }
+--   deriving (Generic)
+--   deriving Pretty via PPGeneric (TestWithDeriving a b)
+-- :}
+--
+newtype PPGeneric a = PPGeneric { unPPGeneric :: a }
+
+instance (Generic a, GPretty (Rep a)) => Pretty (PPGeneric a) where
+  pretty = ppGeneric . unPPGeneric
+
+-- | Prettyprint using 'GHC.Generics.Generic' instance.
+--
+-- >>> :{
 -- test = Test
 --   { testSet         = Just $ Set.fromList [1..3]
 --   , testMap         =
@@ -309,17 +321,14 @@
 
 instance {-# OVERLAPS #-} PPGenericOverride (ForeignPtr a)        where ppGenericOverride = atomicMetaDoc . pretty . show
 
+instance {-# OVERLAPS #-} PPGenericOverride a => PPGenericOverride (TH.TyVarBndr a) where ppGenericOverride = gpretty . from
+
 instance {-# OVERLAPS #-} PPGenericOverride TH.OccName            where ppGenericOverride = gpretty . from
 instance {-# OVERLAPS #-} PPGenericOverride TH.NameFlavour        where ppGenericOverride = gpretty . from
 instance {-# OVERLAPS #-} PPGenericOverride TH.PkgName            where ppGenericOverride = gpretty . from
 instance {-# OVERLAPS #-} PPGenericOverride TH.NameSpace          where ppGenericOverride = gpretty . from
 instance {-# OVERLAPS #-} PPGenericOverride TH.ModName            where ppGenericOverride = gpretty . from
 instance {-# OVERLAPS #-} PPGenericOverride TH.Name               where ppGenericOverride = gpretty . from
-#if MIN_VERSION_template_haskell(2, 17, 0)
-instance {-# OVERLAPS #-} PPGenericOverride a => PPGenericOverride (TH.TyVarBndr a) where ppGenericOverride = gpretty . from
-#else
-instance {-# OVERLAPS #-} PPGenericOverride TH.TyVarBndr          where ppGenericOverride = gpretty . from
-#endif
 instance {-# OVERLAPS #-} PPGenericOverride TH.TyLit              where ppGenericOverride = gpretty . from
 instance {-# OVERLAPS #-} PPGenericOverride TH.Type               where ppGenericOverride = gpretty . from
 instance {-# OVERLAPS #-} PPGenericOverride TH.SourceUnpackedness where ppGenericOverride = gpretty . from
@@ -336,10 +345,8 @@
 instance {-# OVERLAPS #-} PPGenericOverride TH.Exp                where ppGenericOverride = gpretty . from
 instance {-# OVERLAPS #-} PPGenericOverride TH.Pat                where ppGenericOverride = gpretty . from
 instance {-# OVERLAPS #-} PPGenericOverride TH.Clause             where ppGenericOverride = gpretty . from
-#if MIN_VERSION_template_haskell(2, 12, 0)
 instance {-# OVERLAPS #-} PPGenericOverride TH.DerivStrategy      where ppGenericOverride = gpretty . from
 instance {-# OVERLAPS #-} PPGenericOverride TH.DerivClause        where ppGenericOverride = gpretty . from
-#endif
 instance {-# OVERLAPS #-} PPGenericOverride TH.FunDep             where ppGenericOverride = gpretty . from
 instance {-# OVERLAPS #-} PPGenericOverride TH.Overlap            where ppGenericOverride = gpretty . from
 instance {-# OVERLAPS #-} PPGenericOverride TH.Callconv           where ppGenericOverride = gpretty . from
@@ -358,14 +365,14 @@
 instance {-# OVERLAPS #-} PPGenericOverride TH.InjectivityAnn     where ppGenericOverride = gpretty . from
 instance {-# OVERLAPS #-} PPGenericOverride TH.TypeFamilyHead     where ppGenericOverride = gpretty . from
 instance {-# OVERLAPS #-} PPGenericOverride TH.Role               where ppGenericOverride = gpretty . from
-#if MIN_VERSION_template_haskell(2, 12, 0)
 instance {-# OVERLAPS #-} PPGenericOverride TH.PatSynArgs         where ppGenericOverride = gpretty . from
 instance {-# OVERLAPS #-} PPGenericOverride TH.PatSynDir          where ppGenericOverride = gpretty . from
-#endif
 instance {-# OVERLAPS #-} PPGenericOverride TH.Dec                where ppGenericOverride = gpretty . from
 instance {-# OVERLAPS #-} PPGenericOverride TH.Info               where ppGenericOverride = gpretty . from
-#if MIN_VERSION_template_haskell(2, 17, 0)
 instance {-# OVERLAPS #-} PPGenericOverride TH.Specificity        where ppGenericOverride = gpretty . from
+
+#if MIN_VERSION_template_haskell(2, 21, 0)
+instance {-# OVERLAPS #-} PPGenericOverride TH.BndrVis            where ppGenericOverride = gpretty . from
 #endif
 
 instance {-# OVERLAPS #-}
@@ -387,35 +394,6 @@
     , PPGenericOverrideToPretty b
     , PPGenericOverrideToPretty c
     )
-
--- instance {-# OVERLAPS #-}
---   ( PPGenericOverride a
---   , PPGenericOverride b
---   , PPGenericOverride c
---   , PPGenericOverride d
---   ) => PPGenericOverride (a, b, c, d) where
---   ppGenericOverride (a, b, c, d) = atomicMetaDoc $ pretty
---     ( PPGenericOverrideToPretty a
---     , PPGenericOverrideToPretty b
---     , PPGenericOverrideToPretty c
---     , PPGenericOverrideToPretty d
---     )
---
--- instance {-# OVERLAPS #-}
---   ( PPGenericOverride a
---   , PPGenericOverride b
---   , PPGenericOverride c
---   , PPGenericOverride d
---   , PPGenericOverride e
---   ) => PPGenericOverride (a, b, c, d, e) where
---   ppGenericOverride (a, b, c, d, e) = atomicMetaDoc $ pretty
---     ( PPGenericOverrideToPretty a
---     , PPGenericOverrideToPretty b
---     , PPGenericOverrideToPretty c
---     , PPGenericOverrideToPretty d
---     , PPGenericOverrideToPretty e
---     )
-
 
 instance {-# OVERLAPS #-} PPGenericOverride v => PPGenericOverride (Maybe v) where
   ppGenericOverride =
diff --git a/src/Prettyprinter/MetaDoc.hs b/src/Prettyprinter/MetaDoc.hs
--- a/src/Prettyprinter/MetaDoc.hs
+++ b/src/Prettyprinter/MetaDoc.hs
@@ -6,8 +6,6 @@
 -- Maintainer  :  serg.foo@gmail.com
 ----------------------------------------------------------------------------
 
-{-# LANGUAGE ScopedTypeVariables #-}
-
 module Prettyprinter.MetaDoc
   ( DocKind(..)
   , MetaDoc
diff --git a/src/Prettyprinter/Show.hs b/src/Prettyprinter/Show.hs
--- a/src/Prettyprinter/Show.hs
+++ b/src/Prettyprinter/Show.hs
@@ -10,7 +10,10 @@
 {-# LANGUAGE LambdaCase        #-}
 {-# LANGUAGE OverloadedStrings #-}
 
-module Prettyprinter.Show (ppShow) where
+module Prettyprinter.Show
+  ( ppShow
+  , PPShow(..)
+  ) where
 
 import Data.Text qualified as T
 import Prettyprinter
@@ -18,6 +21,30 @@
 import Prettyprinter.Combinators
 import Prettyprinter.MetaDoc
 import Text.Show.Pretty (parseValue, Value(..))
+
+-- $setup
+-- >>> :set -XDerivingVia
+-- >>> import Data.IntMap (IntMap)
+-- >>> import Data.Map.Strict (Map)
+-- >>> import Data.Set (Set)
+
+-- | Helper to use 'Show'-based prettyprinting with DerivingVia.
+--
+-- >>> :{
+-- data TestWithDeriving a b = TestWithDeriving
+--   { testSet         :: Maybe (Set a)
+--   , testB           :: b
+--   , testIntMap      :: IntMap String
+--   , testComplexMap  :: Map (Maybe (Set Int)) (IntMap (Set String))
+--   }
+--   deriving (Show)
+--   deriving Pretty via PPShow (TestWithDeriving a b)
+-- :}
+--
+newtype PPShow a = PPShow { unPPShow :: a }
+
+instance Show a => Pretty (PPShow a) where
+  pretty = ppShow . unPPShow
 
 ppShow :: Show a => a -> Doc ann
 ppShow x =
