diff --git a/CHANGELOG.md b/CHANGELOG.md
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -1,3 +1,9 @@
+## Version 1.7 (2025-09-22)
+
+* Fix eta-reduction issues for GHC 9.0; add CI and cabal support for GHC 9.0.2 ([#557][557], [@tomjaguarpaw][tomjaguarpaw])
+* Allow lifted-async 0.11 ([#556][556], [@felixonmars][felixonmars])
+* Remove `fromJust` call by using a separate existential wrapper ([#554][554], [@HuwCampbell][HuwCampbell])
+
 ## Version 1.6 (2025-09-08)
 
 * Fix GitHub CI URL ([#545][545], [@tmcgilchrist][tmcgilchrist])
@@ -326,6 +332,12 @@
 [tmcgilchrist]:
   https://github.com/tmcgilchrist
 
+[557]:
+  https://github.com/hedgehogqa/haskell-hedgehog/pull/557
+[556]:
+  https://github.com/hedgehogqa/haskell-hedgehog/pull/556
+[554]:
+  https://github.com/hedgehogqa/haskell-hedgehog/pull/554
 [544]:
   https://github.com/hedgehogqa/haskell-hedgehog/pull/544
 [540]:
diff --git a/README.md b/README.md
--- a/README.md
+++ b/README.md
@@ -17,7 +17,7 @@
 
 <div align="left">
 
-[Hedgehog](http://hedgehog.qa/) automatically generates a comprehensive array of test cases, exercising your software in ways human testers would never imagine.
+[Hedgehog](https://hackage.haskell.org/package/hedgehog) automatically generates a comprehensive array of test cases, exercising your software in ways human testers would never imagine.
 
 Generate hundreds of test cases automatically, exposing even the most insidious of corner cases. Failures are automatically simplified, giving developers coherent, intelligible error messages.
 
diff --git a/hedgehog.cabal b/hedgehog.cabal
--- a/hedgehog.cabal
+++ b/hedgehog.cabal
@@ -1,4 +1,4 @@
-version: 1.6
+version: 1.7
 
 name:
   hedgehog
@@ -7,13 +7,13 @@
 maintainer:
   Jacob Stanley <jacob@stanley.io>
 homepage:
-  https://hedgehog.qa
+  http://github.com/hedgehogqa/haskell-hedgehog
 bug-reports:
   https://github.com/hedgehogqa/haskell-hedgehog/issues
 synopsis:
   Release with confidence.
 description:
-  <http://hedgehog.qa/ Hedgehog> automatically generates a comprehensive array
+  <http://github.com/hedgehogqa/haskell-hedgehog/ Hedgehog> automatically generates a comprehensive array
   of test cases, exercising your software in ways human testers would never
   imagine.
   .
@@ -38,6 +38,7 @@
   , GHC == 8.6.5
   , GHC == 8.8.3
   , GHC == 8.10.1
+  , GHC == 9.0.2
   , GHC == 9.2.7
   , GHC == 9.4.8
   , GHC == 9.6.6
@@ -67,7 +68,7 @@
     , directory                       >= 1.2        && < 1.4
     , erf                             >= 2.0        && < 2.1
     , exceptions                      >= 0.7        && < 0.11
-    , lifted-async                    >= 0.7        && < 0.11
+    , lifted-async                    >= 0.7        && < 0.12
     , mmorph                          >= 1.0        && < 1.3
     , monad-control                   >= 1.0        && < 1.1
     , mtl                             >= 2.1        && < 2.4
diff --git a/src/Hedgehog/Internal/Gen.hs b/src/Hedgehog/Internal/Gen.hs
--- a/src/Hedgehog/Internal/Gen.hs
+++ b/src/Hedgehog/Internal/Gen.hs
@@ -1208,7 +1208,7 @@
 --   /The input list must be non-empty./
 --
 element_ :: (HasCallStack, MonadGen m) => [a] -> m a
-element_ = withFrozenCallStack . \case
+element_ l = withFrozenCallStack $ case l of
   [] ->
     error "Hedgehog.Gen.element: used with empty list"
   xs -> do
@@ -1222,7 +1222,7 @@
 --   /The input list must be non-empty./
 --
 choice :: (HasCallStack, MonadGen m) => [m a] -> m a
-choice = withFrozenCallStack . \case
+choice l = withFrozenCallStack $ case l of
   [] ->
     error "Hedgehog.Gen.choice: used with empty list"
   xs -> do
@@ -1237,7 +1237,7 @@
 --   /The input list must be non-empty./
 --
 frequency :: (HasCallStack, MonadGen m) => [(Int, m a)] -> m a
-frequency = withFrozenCallStack . \case
+frequency l = withFrozenCallStack $ case l of
   [] ->
     error "Hedgehog.Gen.frequency: used with empty list"
   xs0 -> do
diff --git a/src/Hedgehog/Internal/State.hs b/src/Hedgehog/Internal/State.hs
--- a/src/Hedgehog/Internal/State.hs
+++ b/src/Hedgehog/Internal/State.hs
@@ -35,7 +35,6 @@
   -- * Commands
   , Command(..)
   , Callback(..)
-  , commandGenOK
 
   -- * Actions
   , Action(..)
@@ -402,12 +401,27 @@
         [Callback input output state]
     }
 
--- | Checks that input for a command can be executed in the given state.
+
+-- | An actionable command is a command that can generate an action given
+--   the current symbolic state, that is, its @commandGen@ returns @Just@.
 --
-commandGenOK :: Command gen m state -> state Symbolic -> Bool
-commandGenOK (Command inputGen _ _) state =
-  Maybe.isJust (inputGen state)
+--   This is an internal type required to hold on to the existential
+--   types when building actions.
+--
+data Actionable gen m (state :: (Type -> Type) -> Type) =
+  forall input output.
+  (TraversableB input, Show (input Symbolic), Show output, Typeable output) =>
+  Actionable {
+      _actionableGen ::
+        gen (input Symbolic)
 
+    , _actionableExecute ::
+        input Concrete -> m output
+
+    , _actionableCallbacks ::
+        [Callback input output state]
+    }
+
 -- | An instantiation of a 'Command' which can be executed, and its effect
 --   evaluated.
 --
@@ -545,21 +559,19 @@
   Gen.justT $ do
     Context state0 _ <- get
 
-    Command mgenInput exec callbacks <-
-      Gen.element_ $ filter (\c -> commandGenOK c state0) commands
+    Actionable genInput exec callbacks <-
+      Gen.element_
+        [ Actionable gen exec callbacks
+        | Command inputGen exec callbacks <- commands
+        , Just gen <- [inputGen state0]
+        ]
 
     -- If we shrink the input, we still want to use the same output. Otherwise
     -- any actions using this output as part of their input will be dropped. But
     -- the existing output is still in the context, so `contextNewVar` will
     -- create a new one. To avoid that, we generate the output before the input.
     output <- contextNewVar
-
-    input <-
-      case mgenInput state0 of
-        Nothing ->
-          error "genCommand: internal error, tried to use generator with invalid state."
-        Just gen ->
-          hoist lift $ Gen.toGenT gen
+    input  <- hoist lift $ Gen.toGenT genInput
 
     if not $ callbackRequire callbacks state0 input then
       pure Nothing
@@ -650,7 +662,7 @@
   -> [Command gen m state]
   -> gen (Sequential m state)
 sequential range initial commands =
-  fmap (Sequential . fst) $
+  Sequential . fst <$>
     genActions range commands (mkContext initial)
 
 -- | A sequential prefix of actions to execute, with two branches to execute in parallel.
@@ -808,9 +820,8 @@
   withFrozenCallStack $
     let
       ok =
-        any successful .
-        fmap (checkActions initial) $
-        interleave branch1 branch2
+        any (successful . checkActions initial) $
+          interleave branch1 branch2
     in
       if ok then
         pure ()
