diff --git a/ChangeLog.md b/ChangeLog.md
--- a/ChangeLog.md
+++ b/ChangeLog.md
@@ -1,3 +1,10 @@
+1.1 - 2026-07-22
+
+* Upgrade hedgehog to 1.7, supporting hedgehog 1.0-1.8
+* Upgrade contravariant to support versions up to 1.6
+* Upgrade transformers to support versions up to 0.7
+* Add support for GHC 9.0.2, 9.2.8, 9.4.8, 9.6.7, 9.8.4, 9.10.3, 9.12.4
+
 1.0 - 2019-05-17
 
 * Drop support for GHC < 8
diff --git a/example/Example.hs b/example/Example.hs
--- a/example/Example.hs
+++ b/example/Example.hs
@@ -1,32 +1,51 @@
-{-# language ScopedTypeVariables #-}
-{-# language TemplateHaskell #-}
-{-# language TypeApplications #-}
-{-# language RankNTypes #-}
-module Main where
+{-# LANGUAGE RankNTypes          #-}
+{-# LANGUAGE ScopedTypeVariables #-}
+{-# LANGUAGE TemplateHaskell     #-}
+{-# LANGUAGE TypeApplications    #-}
 
-import Hedgehog
-import qualified Hedgehog.Gen as Gen
-import qualified Hedgehog.Range as Range
+module Main where
 
-import Hedgehog.Function
+import           Hedgehog
+import qualified Hedgehog.Gen      as Gen
+import qualified Hedgehog.Range    as Range
+import           Hedgehog.Function
 
-fun_idempotent
+funIdempotent
   :: forall m a
   . (Monad m, Arg a, Vary a, Eq a, Show a)
   => Gen a
   -> PropertyT m ()
-fun_idempotent ga = do
-  a <- forAll ga
-  f <- fmap apply . forAll $ fn @a ga
+funIdempotent genA = do
+  a <- forAll genA
+  f <- forAllFn $ fn @a genA
   f a === f (f a)
 
-prop_unit_fun_idempotent :: Property
-prop_unit_fun_idempotent =
+prop_unit_funIdempotent :: Property
+prop_unit_funIdempotent =
   property $
-    fun_idempotent $ Gen.choice [Right <$> Gen.bool :: Gen (Either () Bool)]
+    funIdempotent $ Gen.choice [Right <$> Gen.bool :: Gen (Either () Bool)]
 
+funCongEquality
+  :: forall m a
+  . (Monad m, Arg a, Vary a, Eq a, Show a)
+  => Gen a
+  -> Gen a
+  -> PropertyT m ()
+funCongEquality genA genB = do
+  a <- forAll genA
+  b <- forAll genB
+  f <- forAllFn $ fn @a genA
+  if a == b
+    then f a === f b
+    else pure ()
+
+prop_funCongEquality :: Property
+prop_funCongEquality =
+  property $
+    funCongEquality (Gen.int (Range.linear 1 10)) (Gen.int (Range.linear 1 10))
+
 -- | map (f . g) xs = map f (map g xs)
-map_compose
+mapCompose
   :: forall f a b c
    . ( Functor f
      , Show (f a)
@@ -41,7 +60,7 @@
   -> Gen b
   -> Gen c
   -> Property
-map_compose genF genA genB genC =
+mapCompose genF genA genB genC =
   property $ do
     g <- forAllFn $ fn @a genB
     f <- forAllFn $ fn @b genC
@@ -50,11 +69,11 @@
 
 prop_map_list :: Property
 prop_map_list =
-  map_compose
+  mapCompose
     (Gen.list (Range.constant 0 100))
     Gen.bool
     Gen.bool
     Gen.bool
 
 main :: IO Bool
-main = checkParallel $$(discover)
+main = checkParallel $$discover
diff --git a/hedgehog-fn.cabal b/hedgehog-fn.cabal
--- a/hedgehog-fn.cabal
+++ b/hedgehog-fn.cabal
@@ -2,7 +2,7 @@
 -- see http://haskell.org/cabal/users-guide/
 
 name:                hedgehog-fn
-version:             1.0
+version:             1.1
 synopsis:            Function generation for `hedgehog`
 description:         Generating shrinkable, showable functions with `hedgehog`. See
                      `Hedgehog.Function` for example usages.
@@ -17,7 +17,7 @@
 build-type:          Simple
 cabal-version:       >=1.10
 extra-source-files:  ChangeLog.md
-tested-with:         GHC==8.0.2, GHC==8.2.2, GHC==8.4.3, GHC==8.6.5
+tested-with:         GHC==8.0.2, GHC==8.2.2, GHC==8.4.3, GHC==8.6.5, GHC==8.8.4, GHC==8.10.7, GHC==9.0.2, GHC==9.2.8, GHC==9.4.8, GHC==9.6.7, GHC==9.8.4, GHC==9.10.3, GHC==9.12.4
 
 source-repository    head
   type:              git
@@ -31,9 +31,9 @@
   exposed-modules:     Hedgehog.Function
                      , Hedgehog.Function.Internal
   build-depends:       base >=4.8 && <5
-                     , contravariant >=1.4 && <1.6
-                     , hedgehog >=1.0 && <1.1
-                     , transformers >=0.5 && <0.6
+                     , contravariant >=1.4 && <1.7
+                     , hedgehog >=1.0 && <1.9
+                     , transformers >=0.4.2 && <0.8
   hs-source-dirs:      src
   default-language:    Haskell2010
 
@@ -44,7 +44,7 @@
   else
     buildable:         False
   hs-source-dirs:      example
-  build-depends:       base >=4.8 && <5
-                     , hedgehog >=1.0 && <1.1
+  build-depends:       base
+                     , hedgehog
                      , hedgehog-fn
   default-language:    Haskell2010
diff --git a/src/Hedgehog/Function/Internal.hs b/src/Hedgehog/Function/Internal.hs
--- a/src/Hedgehog/Function/Internal.hs
+++ b/src/Hedgehog/Function/Internal.hs
@@ -169,8 +169,15 @@
 unsafeApply f = fromJust . apply' f
 
 -- | The type of randomly-generated functions
+{-
+The lone 'b' here is important; we need is as a fall-through case so that we
+can have finitely-sized showable functions. If we didn't have it, then we'd
+never be able to render functions that have an infinitely-sized argument
+(like functions on Integers).
+-}
 data Fn a b = Fn b (a :-> TreeT (MaybeT Identity) b)
 
+
 -- | Extract the root value from a 'TreeT'. Unsafe.
 unsafeFromTree :: Functor m => TreeT (MaybeT m) a -> m a
 unsafeFromTree =
@@ -180,15 +187,17 @@
 
 instance (Show a, Show b) => Show (Fn a b) where
   show (Fn b a) =
+    "\\case\n" ++
     case table a of
-      [] -> "_ -> " ++ show b
-      ta -> showTable ta ++ "_ -> " ++ show b
+      [] -> "  _ -> " ++ show b
+      ta -> showTable ta ++ "  _ -> " ++ show b
     where
       showTable :: (Show a, Show b) => [(a, TreeT (MaybeT Identity) b)] -> String
-      showTable [] = "<empty function>\n"
+      showTable [] = "  <empty function>\n"
       showTable (x : xs) = unlines (showCase <$> x : xs)
         where
-          showCase (lhs, rhs) = show lhs ++ " -> " ++ show (runIdentity $ unsafeFromTree rhs)
+          showCase (lhs, rhs) =
+            "  " ++ show lhs ++ " -> " ++ show (runIdentity $ unsafeFromTree rhs)
 
 -- | Shrink the function
 shrinkFn :: (b -> [b]) -> a :-> b -> [a :-> b]
