diff --git a/changelog.md b/changelog.md
--- a/changelog.md
+++ b/changelog.md
@@ -1,3 +1,7 @@
+### 1.0.0.3 (2023-06-26)
+
+Raise language version to GHC2021
+
 ### 1.0.0.2 (2023-01-10)
 
 Support GHC 9.4
diff --git a/hedgehog-optics.cabal b/hedgehog-optics.cabal
--- a/hedgehog-optics.cabal
+++ b/hedgehog-optics.cabal
@@ -1,7 +1,7 @@
 cabal-version: 3.0
 
 name: hedgehog-optics
-version: 1.0.0.2
+version: 1.0.0.3
 category: Testing, Optics
 synopsis: Hedgehog properties for optics laws
 
@@ -25,7 +25,7 @@
     location: https://github.com/typeclasses/hedgehog-optics
 
 library
-    default-language: Haskell2010
+    default-language: GHC2021
     ghc-options: -Wall
     hs-source-dirs: src
 
@@ -36,6 +36,6 @@
         Hedgehog.Optics
 
     build-depends:
-      , base ^>= 4.14 || ^>= 4.15 || ^>= 4.16 || ^>= 4.17
-      , hedgehog ^>= 1.0.5 || ^>= 1.1 || ^>= 1.2
+      , base ^>= 4.16 || ^>= 4.17 || ^>= 4.18
+      , hedgehog ^>= 1.1.2 || ^>= 1.2
       , optics-core ^>= 0.4.1
diff --git a/src/Hedgehog/Optics.hs b/src/Hedgehog/Optics.hs
--- a/src/Hedgehog/Optics.hs
+++ b/src/Hedgehog/Optics.hs
@@ -1,9 +1,10 @@
 module Hedgehog.Optics
-  (
-    wellFormedPrism, wellFormedLens, wellFormedIso,
+  ( wellFormedPrism,
+    wellFormedLens,
+    wellFormedIso,
     prismExample,
   )
-  where
+where
 
 import Control.Monad (Monad (return))
 import Data.Either (Either (Left, Right))
@@ -21,119 +22,161 @@
 import Optics.Setter (set)
 import Text.Show (Show)
 
-{-| Checks whether a prism respects the well-formedness
-    laws given in "Optics.Prism" -}
-wellFormedPrism :: Monad m =>
-    (Show large, Eq large) => (Show small, Eq small) =>
-    Gen large -> Gen small
-    -> Prism' large small -- ^ Prism signifying that the @small@ type
-                          --   is a subset of the @large@ type -}
-    -> PropertyT m ()
+-- | Checks whether a prism respects the well-formedness
+--    laws given in "Optics.Prism"
+wellFormedPrism ::
+  Monad m =>
+  (Show large, Eq large) =>
+  (Show small, Eq small) =>
+  Gen large ->
+  Gen small ->
+  -- | Prism signifying that the @small@ type
+  --   is a subset of the @large@ type -}
+  Prism' large small ->
+  PropertyT m ()
 wellFormedPrism genLarge genSmall o = do
-    getSetPrismLaw genLarge o
-    setGetPrismLaw genSmall o
+  getSetPrismLaw genLarge o
+  setGetPrismLaw genSmall o
 
-getSetPrismLaw :: Monad m =>
-    (Show large, Eq large) => (Show small, Eq small) =>
-    Gen large -> Prism' large small -> PropertyT m ()
+getSetPrismLaw ::
+  Monad m =>
+  (Show large, Eq large) =>
+  (Show small, Eq small) =>
+  Gen large ->
+  Prism' large small ->
+  PropertyT m ()
 getSetPrismLaw genLarge o = do
-    large <- forAll genLarge
-    case matching o large of
-        Right small -> do
-            annotate "The get-set law must hold for a Prism"
-            review o small === large
-        Left _ -> return ()
+  large <- forAll genLarge
+  case matching o large of
+    Right small -> do
+      annotate "The get-set law must hold for a Prism"
+      review o small === large
+    Left _ -> return ()
 
-setGetPrismLaw :: Monad m =>
-    (Show large, Eq large) => (Show small, Eq small) =>
-    Gen small -> Prism' large small -> PropertyT m ()
+setGetPrismLaw ::
+  Monad m =>
+  (Show large, Eq large) =>
+  (Show small, Eq small) =>
+  Gen small ->
+  Prism' large small ->
+  PropertyT m ()
 setGetPrismLaw genSmall o = do
-    small <- forAll genSmall
-    annotate "The set-get law must hold for a Prism"
-    matching o (review o small) === Right small
+  small <- forAll genSmall
+  annotate "The set-get law must hold for a Prism"
+  matching o (review o small) === Right small
 
-{-| Checks whether a lens respects the well-formedness
-    laws given in "Optics.Lens" -}
-wellFormedLens :: Monad m =>
-    (Show large, Eq large) => (Show small, Eq small) =>
-    Gen large -> Gen small
-    -> Lens' large small -- ^ Lens signifying that the @small@ type is
-                         --   a constituent part of the @large@ type
-    -> PropertyT m ()
+-- | Checks whether a lens respects the well-formedness
+--    laws given in "Optics.Lens"
+wellFormedLens ::
+  Monad m =>
+  (Show large, Eq large) =>
+  (Show small, Eq small) =>
+  Gen large ->
+  Gen small ->
+  -- | Lens signifying that the @small@ type is
+  --   a constituent part of the @large@ type
+  Lens' large small ->
+  PropertyT m ()
 wellFormedLens genLarge genSmall o = do
-    getPutLensLaw genLarge genSmall o
-    putGetLensLaw genLarge o
-    putPutLensLaw genLarge genSmall o
+  getPutLensLaw genLarge genSmall o
+  putGetLensLaw genLarge o
+  putPutLensLaw genLarge genSmall o
 
-getPutLensLaw :: Monad m =>
-    (Show large, Eq large) => (Show small, Eq small) =>
-    Gen large -> Gen small -> Lens' large small
-    -> PropertyT m ()
+getPutLensLaw ::
+  Monad m =>
+  (Show large, Eq large) =>
+  (Show small, Eq small) =>
+  Gen large ->
+  Gen small ->
+  Lens' large small ->
+  PropertyT m ()
 getPutLensLaw genLarge genSmall o = do
-    large <- forAll genLarge
-    small <- forAll genSmall
-    annotate "The set-get law must hold for a Lens"
-    view o (set o small large) === small
+  large <- forAll genLarge
+  small <- forAll genSmall
+  annotate "The set-get law must hold for a Lens"
+  view o (set o small large) === small
 
-putGetLensLaw :: Monad m =>
-    (Show large, Eq large) => (Show small, Eq small) =>
-    Gen large -> Lens' large small -> PropertyT m ()
+putGetLensLaw ::
+  Monad m =>
+  (Show large, Eq large) =>
+  (Show small, Eq small) =>
+  Gen large ->
+  Lens' large small ->
+  PropertyT m ()
 putGetLensLaw genLarge o = do
-    large <- forAll genLarge
-    annotate "The get-set law must hold for a Lens"
-    set o (view o large) large === large
+  large <- forAll genLarge
+  annotate "The get-set law must hold for a Lens"
+  set o (view o large) large === large
 
-putPutLensLaw :: Monad m =>
-    (Show large, Eq large) => (Show small, Eq small) =>
-    Gen large -> Gen small -> Lens' large small
-    -> PropertyT m ()
+putPutLensLaw ::
+  Monad m =>
+  (Show large, Eq large) =>
+  (Show small, Eq small) =>
+  Gen large ->
+  Gen small ->
+  Lens' large small ->
+  PropertyT m ()
 putPutLensLaw genLarge genSmall o = do
-    large <- forAll genLarge
-    small1 <- forAll genSmall
-    small2 <- forAll genSmall
-    annotate "The set-set law must hold for a Lens"
-    set o small2 (set o small1 large) === set o small2 large
+  large <- forAll genLarge
+  small1 <- forAll genSmall
+  small2 <- forAll genSmall
+  annotate "The set-set law must hold for a Lens"
+  set o small2 (set o small1 large) === set o small2 large
 
-{-| Checks whether an isomorphism respects the
-    well-formedness laws given in "Optics.Iso" -}
-wellFormedIso :: Monad m =>
-    (Show a, Eq a) => (Show b, Eq b) =>
-    Gen a -> Gen b
-    -> Iso' a b -- ^ Isomorphism signifying that types
-                --   @a@ and @b@ are basically the same thing
-    -> PropertyT m ()
+-- | Checks whether an isomorphism respects the
+--    well-formedness laws given in "Optics.Iso"
+wellFormedIso ::
+  Monad m =>
+  (Show a, Eq a) =>
+  (Show b, Eq b) =>
+  Gen a ->
+  Gen b ->
+  -- | Isomorphism signifying that types
+  --   @a@ and @b@ are basically the same thing
+  Iso' a b ->
+  PropertyT m ()
 wellFormedIso genA genB o = do
-    setGetIsoLaw genB o
-    getSetIsoLaw genA o
+  setGetIsoLaw genB o
+  getSetIsoLaw genA o
 
-setGetIsoLaw :: Monad m =>
-    (Show a, Eq a) => (Show b, Eq b) =>
-    Gen b -> Iso' a b -> PropertyT m ()
+setGetIsoLaw ::
+  Monad m =>
+  (Show a, Eq a) =>
+  (Show b, Eq b) =>
+  Gen b ->
+  Iso' a b ->
+  PropertyT m ()
 setGetIsoLaw genB o = do
-    b <- forAll genB
-    annotate "The set-get law must hold for an Iso"
-    (view o . review o) b === b
+  b <- forAll genB
+  annotate "The set-get law must hold for an Iso"
+  (view o . review o) b === b
 
-getSetIsoLaw :: Monad m =>
-    (Show a, Eq a) => (Show b, Eq b) =>
-    Gen a -> Iso' a b -> PropertyT m ()
+getSetIsoLaw ::
+  Monad m =>
+  (Show a, Eq a) =>
+  (Show b, Eq b) =>
+  Gen a ->
+  Iso' a b ->
+  PropertyT m ()
 getSetIsoLaw genA o = do
-    a <- forAll genA
-    annotate "The get-set law must hold for an Iso"
-    (review o . view o) a === a
-
-{-| Assert that a prism matches for a particular set of values
-
-A 'review' of the @small@ value should produce the @large@ value, and
-a 'preview' of the @large@ value should produce the @small@ value. -}
-prismExample :: Monad m =>
-    (Show large, Eq large) => (Show small, Eq small) =>
-    Prism' large small -- ^ Prism signifying that the @small@
-                       --   type is a subset of the @large@ type
-    -> large
-    -> small
-    -> PropertyT m ()
+  a <- forAll genA
+  annotate "The get-set law must hold for an Iso"
+  (review o . view o) a === a
 
+-- | Assert that a prism matches for a particular set of values
+--
+-- A 'review' of the @small@ value should produce the @large@ value, and
+-- a 'preview' of the @large@ value should produce the @small@ value.
+prismExample ::
+  Monad m =>
+  (Show large, Eq large) =>
+  (Show small, Eq small) =>
+  -- | Prism signifying that the @small@
+  --   type is a subset of the @large@ type
+  Prism' large small ->
+  large ->
+  small ->
+  PropertyT m ()
 prismExample o large small = do
-    review o small === large
-    preview o large === Just small
+  review o small === large
+  preview o large === Just small
