diff --git a/ChangeLog.md b/ChangeLog.md
--- a/ChangeLog.md
+++ b/ChangeLog.md
@@ -1,3 +1,8 @@
+0.10.2
+===
+
+GHC 9.6.2 upgrade
+
 0.8.0
 ===
 
diff --git a/app/rep-example.hs b/app/rep-example.hs
--- a/app/rep-example.hs
+++ b/app/rep-example.hs
@@ -1,23 +1,13 @@
 {-# LANGUAGE ApplicativeDo #-}
 {-# LANGUAGE DataKinds #-}
-{-# LANGUAGE FlexibleContexts #-}
-{-# LANGUAGE FlexibleInstances #-}
 {-# LANGUAGE OverloadedLabels #-}
 {-# LANGUAGE OverloadedStrings #-}
-{-# LANGUAGE ScopedTypeVariables #-}
-{-# HLINT ignore "Eta reduce" #-}
-{-# LANGUAGE TupleSections #-}
-{-# OPTIONS_GHC -Wall #-}
-{-# OPTIONS_GHC -Wno-unrecognised-pragmas #-}
-{-# OPTIONS_GHC -Wno-unused-top-binds #-}
 
-{-# HLINT ignore "Use newtype instead of data" #-}
-
 import Box
 import Control.Monad
 import Data.Bifunctor
 import Data.Text (pack)
-import qualified Lucid as L
+import Lucid qualified as L
 import Optics.Core
 import Options.Applicative
 import Web.Rep
@@ -31,7 +21,7 @@
   | ClosureBug
   deriving (Eq, Show)
 
-data Options = Options
+newtype Options = Options
   { optionAppType :: AppType
   }
   deriving (Eq, Show)
diff --git a/src/Web/Rep.hs b/src/Web/Rep.hs
--- a/src/Web/Rep.hs
+++ b/src/Web/Rep.hs
@@ -57,7 +57,7 @@
   )
 where
 
-import qualified Data.HashMap.Strict as HashMap
+import Data.HashMap.Strict qualified as HashMap
 import Web.Rep.Bootstrap
 import Web.Rep.Html
 import Web.Rep.Html.Input
diff --git a/src/Web/Rep/Bootstrap.hs b/src/Web/Rep/Bootstrap.hs
--- a/src/Web/Rep/Bootstrap.hs
+++ b/src/Web/Rep/Bootstrap.hs
@@ -1,8 +1,4 @@
-{-# LANGUAGE DeriveGeneric #-}
-{-# LANGUAGE FlexibleContexts #-}
 {-# LANGUAGE OverloadedStrings #-}
-{-# LANGUAGE StrictData #-}
-{-# OPTIONS_GHC -Wall #-}
 
 -- | Some <https://getbootstrap.com/ bootstrap> assets and functionality.
 module Web.Rep.Bootstrap
diff --git a/src/Web/Rep/Examples.hs b/src/Web/Rep/Examples.hs
--- a/src/Web/Rep/Examples.hs
+++ b/src/Web/Rep/Examples.hs
@@ -1,11 +1,7 @@
 {-# LANGUAGE ApplicativeDo #-}
-{-# LANGUAGE DeriveGeneric #-}
-{-# LANGUAGE FlexibleContexts #-}
 {-# LANGUAGE OverloadedLabels #-}
 {-# LANGUAGE OverloadedStrings #-}
 {-# LANGUAGE QuasiQuotes #-}
-{-# LANGUAGE StrictData #-}
-{-# OPTIONS_GHC -Wall #-}
 
 module Web.Rep.Examples
   ( page1,
@@ -26,7 +22,7 @@
   )
 where
 
-import qualified Clay
+import Clay qualified
 import Data.Attoparsec.Text
 import Data.Biapplicative
 import Data.Bool
diff --git a/src/Web/Rep/Html.hs b/src/Web/Rep/Html.hs
--- a/src/Web/Rep/Html.hs
+++ b/src/Web/Rep/Html.hs
@@ -1,8 +1,4 @@
-{-# LANGUAGE FlexibleContexts #-}
-{-# LANGUAGE IncoherentInstances #-}
 {-# LANGUAGE OverloadedStrings #-}
-{-# LANGUAGE StrictData #-}
-{-# OPTIONS_GHC -Wall #-}
 {-# OPTIONS_GHC -fno-warn-orphans #-}
 
 -- | Key generators and miscellaneous html utilities.
@@ -21,7 +17,7 @@
 import Data.Bool
 import Data.List (intersperse)
 import Data.Text (Text, pack)
-import qualified Data.Text.Lazy as Lazy
+import Data.Text.Lazy qualified as Lazy
 import Lucid
 
 -- $setup
diff --git a/src/Web/Rep/Html/Input.hs b/src/Web/Rep/Html/Input.hs
--- a/src/Web/Rep/Html/Input.hs
+++ b/src/Web/Rep/Html/Input.hs
@@ -1,7 +1,4 @@
-{-# LANGUAGE DeriveGeneric #-}
 {-# LANGUAGE OverloadedStrings #-}
-{-# LANGUAGE StrictData #-}
-{-# OPTIONS_GHC -Wall #-}
 
 -- | Common web page input elements, often with bootstrap scaffolding.
 module Web.Rep.Html.Input
@@ -245,7 +242,6 @@
                   <$> opts
             )
       )
-  -- FIXME: How can you refactor to eliminate this polymorphic wart?
   toHtml (Input _ l i (Checkbox checked)) =
     with
       div_
diff --git a/src/Web/Rep/Page.hs b/src/Web/Rep/Page.hs
--- a/src/Web/Rep/Page.hs
+++ b/src/Web/Rep/Page.hs
@@ -1,13 +1,7 @@
-{-# LANGUAGE DeriveGeneric #-}
-{-# LANGUAGE DeriveTraversable #-}
-{-# LANGUAGE FlexibleContexts #-}
 {-# LANGUAGE OverloadedLabels #-}
 {-# LANGUAGE OverloadedStrings #-}
 {-# LANGUAGE QuasiQuotes #-}
-{-# LANGUAGE StrictData #-}
-{-# LANGUAGE TupleSections #-}
 {-# OPTIONS_GHC -fno-warn-incomplete-patterns #-}
-{-# OPTIONS_HADDOCK hide, not-home #-}
 
 module Web.Rep.Page
   ( -- $page
@@ -36,7 +30,7 @@
 where
 
 import Clay (Css)
-import qualified Clay
+import Clay qualified
 import Data.Text (Text, unpack)
 import Data.Text.Lazy (toStrict)
 import GHC.Generics
diff --git a/src/Web/Rep/Server.hs b/src/Web/Rep/Server.hs
--- a/src/Web/Rep/Server.hs
+++ b/src/Web/Rep/Server.hs
@@ -1,6 +1,4 @@
-{-# LANGUAGE FlexibleInstances #-}
 {-# LANGUAGE OverloadedLabels #-}
-{-# OPTIONS_GHC -Wall #-}
 
 -- | Serve pages via 'ScottyM'
 module Web.Rep.Server
diff --git a/src/Web/Rep/Shared.hs b/src/Web/Rep/Shared.hs
--- a/src/Web/Rep/Shared.hs
+++ b/src/Web/Rep/Shared.hs
@@ -1,10 +1,4 @@
-{-# LANGUAGE DeriveTraversable #-}
-{-# LANGUAGE FlexibleContexts #-}
 {-# LANGUAGE OverloadedStrings #-}
-{-# LANGUAGE StrictData #-}
-{-# LANGUAGE TupleSections #-}
-{-# OPTIONS_GHC -fno-warn-incomplete-patterns #-}
-{-# OPTIONS_HADDOCK hide, not-home #-}
 
 module Web.Rep.Shared
   ( RepF (..),
@@ -22,10 +16,11 @@
 where
 
 import Control.Applicative
+import Control.Monad
 import Control.Monad.State.Lazy
 import Data.Biapplicative
 import Data.HashMap.Strict (HashMap)
-import qualified Data.HashMap.Strict as HashMap
+import Data.HashMap.Strict qualified as HashMap
 import Data.Text (Text, pack)
 import Lucid
 import Optics.Core
diff --git a/src/Web/Rep/SharedReps.hs b/src/Web/Rep/SharedReps.hs
--- a/src/Web/Rep/SharedReps.hs
+++ b/src/Web/Rep/SharedReps.hs
@@ -1,11 +1,7 @@
 {-# LANGUAGE ApplicativeDo #-}
-{-# LANGUAGE IncoherentInstances #-}
 {-# LANGUAGE OverloadedLabels #-}
 {-# LANGUAGE OverloadedStrings #-}
 {-# LANGUAGE QuasiQuotes #-}
-{-# LANGUAGE StrictData #-}
-{-# LANGUAGE TupleSections #-}
-{-# OPTIONS_GHC -Wall #-}
 
 -- | Various SharedRep instances for common html input elements.
 module Web.Rep.SharedReps
@@ -46,11 +42,11 @@
 import Control.Monad
 import Control.Monad.State.Lazy
 import Data.Attoparsec.Text hiding (take)
-import qualified Data.Attoparsec.Text as A
+import Data.Attoparsec.Text qualified as A
 import Data.Biapplicative
 import Data.Bool
-import qualified Data.HashMap.Strict as HashMap
-import qualified Data.List as List
+import Data.HashMap.Strict qualified as HashMap
+import Data.List qualified as List
 import Data.Text (Text, intercalate, pack, unpack)
 import Lucid
 import Optics.Core
diff --git a/src/Web/Rep/Socket.hs b/src/Web/Rep/Socket.hs
--- a/src/Web/Rep/Socket.hs
+++ b/src/Web/Rep/Socket.hs
@@ -1,16 +1,7 @@
-{-# LANGUAGE DeriveGeneric #-}
-{-# LANGUAGE FlexibleContexts #-}
 {-# LANGUAGE OverloadedLabels #-}
 {-# LANGUAGE OverloadedStrings #-}
 {-# LANGUAGE QuasiQuotes #-}
-{-# LANGUAGE StrictData #-}
-{-# OPTIONS_GHC -Wall #-}
-{-# HLINT ignore "Eta reduce" #-}
-{-# OPTIONS_GHC -Wno-type-defaults #-}
-{-# OPTIONS_GHC -Wno-unrecognised-pragmas #-}
 
-{-# HLINT ignore "Redundant <$>" #-}
-
 -- | A socket between a web page and haskell, based on the box library.
 module Web.Rep.Socket (socketPage, defaultSocketPage, SocketConfig (..), defaultSocketConfig, serveSocketBox, CodeBox, CoCodeBox, CodeBoxConfig (..), defaultCodeBoxConfig, codeBox, codeBoxWith, serveRep, serveRepWithBox, replaceInput, replaceOutput, replaceOutput_, sharedStream, PlayConfig (..), defaultPlayConfig, repPlayConfig, servePlayStream, servePlayStreamWithBox, parserJ, Code (..), code, console, val, replace, append, clean, webSocket, refreshJsbJs, preventEnter, runScriptJs) where
 
@@ -19,18 +10,18 @@
 import Control.Concurrent.Async
 import Control.Monad
 import Control.Monad.State.Lazy
-import qualified Data.Attoparsec.Text as A
+import Data.Attoparsec.Text qualified as A
 import Data.Bifunctor
 import Data.Bool
 import Data.Functor.Contravariant
 import Data.HashMap.Strict as HashMap
 import Data.Profunctor
 import Data.Text (Text, pack)
-import qualified Data.Text as Text
+import Data.Text qualified as Text
 import GHC.Generics
 import Lucid as L
 import Network.Wai.Handler.WebSockets
-import qualified Network.WebSockets as WS
+import Network.WebSockets qualified as WS
 import Optics.Core
 import Text.InterpolatedString.Perl6
 import Web.Rep.Bootstrap
@@ -220,7 +211,7 @@
   (playBox, _) <- toBoxM (Latest (False, pcfg))
   race_
     (sharedStream ((,) <$> repReset <*> repPlayConfig pcfg) (contramap (\h -> [Replace "input" (toText h)]) c) (witherC (either (const (pure Nothing)) (pure . Just)) (committer playBox)) e)
-    (restart (fst <$> emitter playBox) (glue c <$|> speedSkipEffect ((\x -> (playFrame (snd x), playSpeed (snd x))) <$> emitter playBox) =<< pauser (playPause . snd <$> emitter playBox) <$> pipe))
+    (restart (fst <$> emitter playBox) (glue c <$|> speedSkipEffect ((\x -> (playFrame (snd x), playSpeed (snd x))) <$> emitter playBox) . pauser (playPause . snd <$> emitter playBox) =<< pipe))
   pure ()
 
 -- | Serve an emitter controlled by a PlayConfig representation.
diff --git a/web-rep.cabal b/web-rep.cabal
--- a/web-rep.cabal
+++ b/web-rep.cabal
@@ -1,6 +1,6 @@
-cabal-version:      2.4
+cabal-version:      3.0
 name:               web-rep
-version:            0.10.1
+version:            0.10.2.0
 synopsis:           representations of a web page
 category:           web
 description:
@@ -11,15 +11,81 @@
 license:            MIT
 license-file:       LICENSE.md
 build-type:         Simple
-extra-source-files: ChangeLog.md
-tested-with:
-  GHC ==8.6.5 || ==8.8.4 || ==8.10.7 || ==9.2.5 || ==9.4.4
+extra-doc-files: ChangeLog.md
+tested-with:        GHC == 8.10.7 || ==9.2.8 || ==9.4.5 || ==9.6.2
 
 source-repository head
   type:     git
   location: https://github.com/tonyday567/web-rep
+common ghc2021-stanza
+  if impl(ghc >=9.2)
+    default-language:
+      GHC2021
+  if impl(ghc <9.2)
+    default-language:
+      Haskell2010
+    default-extensions:
+      BangPatterns
+      BinaryLiterals
+      ConstrainedClassMethods
+      ConstraintKinds
+      DeriveDataTypeable
+      DeriveFoldable
+      DeriveFunctor
+      DeriveGeneric
+      DeriveLift
+      DeriveTraversable
+      DoAndIfThenElse
+      EmptyCase
+      EmptyDataDecls
+      EmptyDataDeriving
+      ExistentialQuantification
+      ExplicitForAll
+      FlexibleContexts
+      FlexibleInstances
+      ForeignFunctionInterface
+      GADTSyntax
+      GeneralisedNewtypeDeriving
+      HexFloatLiterals
+      ImplicitPrelude
+      InstanceSigs
+      KindSignatures
+      MonomorphismRestriction
+      MultiParamTypeClasses
+      NamedFieldPuns
+      NamedWildCards
+      NumericUnderscores
+      PatternGuards
+      PolyKinds
+      PostfixOperators
+      RankNTypes
+      RelaxedPolyRec
+      ScopedTypeVariables
+      StandaloneDeriving
+      StarIsType
+      TraditionalRecordSyntax
+      TupleSections
+      TypeApplications
+      TypeOperators
+      TypeSynonymInstances
+  if impl(ghc <9.2) && impl(ghc >=8.10)
+    default-extensions:
+      ImportQualifiedPost
+      StandaloneKindSignatures
 
+common ghc-options-stanza
+  ghc-options:
+    -Wall
+    -Wcompat
+    -Wincomplete-record-updates
+    -Wincomplete-uni-patterns
+    -Wredundant-constraints
+    -Widentities
+    -Wpartial-fields
+
 library
+  import: ghc2021-stanza
+  import: ghc-options-stanza
   exposed-modules:
     Web.Rep
     Web.Rep.Bootstrap
@@ -36,9 +102,9 @@
   hs-source-dirs:     src
   build-depends:
     , attoparsec                ^>=0.14
-    , base                      >=4.12    && <5
-    , bifunctors                ^>=5.5.11
-    , box                       >=0.9
+    , base                      >=4.12 && <5
+    , bifunctors                >=5.5.11 && <5.7
+    , box                       >=0.9 && < 0.10
     , box-socket                ^>=0.4
     , clay                      >=0.13 && <0.15
     , interpolatedstring-perl6  ^>=1.0
@@ -47,7 +113,7 @@
     , mtl                       >=2.2.2 && <2.4
     , optics-core               ^>=0.4
     , optics-extra              ^>=0.4
-    , profunctors
+    , profunctors               ^>=5.6.2
     , scotty                    >=0.11.5  && <0.13
     , text                      >=1.2.3 && <2.1
     , transformers              >=0.5.6 && <0.6.2
@@ -55,30 +121,22 @@
     , wai-middleware-static     ^>=0.9
     , wai-websockets            ^>=3.0.1.2
     , websockets                ^>=0.12
-    , async
-
-  default-language:   Haskell2010
-  default-extensions:
-  ghc-options:
-    -Wall -Wcompat -Wincomplete-record-updates
-    -Wincomplete-uni-patterns -Wredundant-constraints
+    , async                     ^>=2.2.4
 
 executable web-rep-example
+  import: ghc2021-stanza
+  import: ghc-options-stanza
   main-is:            rep-example.hs
   hs-source-dirs:     app
   build-depends:
-    , base              >=4.12 && <5
-    , optparse-applicative
+    , base >=4.12 && <5
+    , optparse-applicative >=0.17 && <0.19
     , web-rep
-    , box
-    , text
-    , lucid
-    , optics-core
+    , box >=0.9 && < 0.10
+    , text >=1.2.3 && <2.1
+    , lucid >=2.9 && <2.12
+    , optics-core ^>=0.4
 
-  default-language:   Haskell2010
-  default-extensions:
   ghc-options:
-    -Wall -Wcompat -Wincomplete-record-updates
-    -Wincomplete-uni-patterns -Wredundant-constraints
     -funbox-strict-fields -fforce-recomp -threaded -rtsopts
     -with-rtsopts=-N
