diff --git a/CHANGELOG.md b/CHANGELOG.md
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -1,5 +1,18 @@
+## Version 1.0.4 (2020-12-11)
+
+- Bump ansi-terminal to 0.11 ([#394][394], [@mpilgrem][mpilgrem])
+- Clean up hedgehog.cabal for GHC 8.0+ ([#391][391], [@felixonmars][felixonmars])
+- Bump random to 1.2 ([#396][396], [@felixonmars][felixonmars])
+- Improve the distribution of `Range.scaleLinear` ([#405][405], [@jonfowler][jonfowler] / [@moodmosaic][moodmosaic])
+- Change `Gen.frequency` generator immediately shrink ([#406][406], [@ocharles][ocharles] / [@HuwCampbell][HuwCampbell])
+- Add `Property.evalMaybe`, `Property.evalMaybeM` and `Property.evalEitherM` ([#381][381], [@markus1189][markus1189] / [@moodmosaic][moodmosaic])
+- Bump QuickCheck to 2.14 ([#409][409], [@lehins][lehins])
+- Bump bytestring to 0.11 ([#408][408], [@Bodigrim][Bodigrim])
+- Minor Haddock formatting improvments ([#398][398], [@sshine][sshine] / [@moodmosaic][moodmosaic])
+
 ## Version 1.0.3 (2020-06-26)
 
+- Bump cabal-version to 1.10 ([#390][390], [@moodmosaic][moodmosaic])
 - Don't swallow errors if we can't find the source file ([#387][387], [@HuwCampbell][HuwCampbell])
 - Add `Property.evalNF` ([#384][384], [@dcastro][dcastro])
 - Add `Gen.either` and `Gen.either_` ([#382][382], [@dcastro][dcastro])
@@ -190,13 +203,48 @@
   https://github.com/kquick
 [dcastro]:
   https://github.com/dcastro
+[Bodigrim]:
+  https://github.com/Bodigrim
+[lehins]:
+  https://github.com/lehins
+[markus1189]:
+  https://github.com/markus1189
+[ocharles]:
+  https://github.com/ocharles
+[jonfowler]:
+  https://github.com/jonfowler
+[felixonmars]:
+  https://github.com/felixonmars
+[mpilgrem]:
+  https://github.com/mpilgrem
 
+
+[409]:
+  https://github.com/hedgehogqa/haskell-hedgehog/pull/409
+[408]:
+  https://github.com/hedgehogqa/haskell-hedgehog/pull/408
+[406]:
+  https://github.com/hedgehogqa/haskell-hedgehog/pull/406
+[405]:
+  https://github.com/hedgehogqa/haskell-hedgehog/pull/405
+[398]:
+  https://github.com/hedgehogqa/haskell-hedgehog/pull/398
+[396]:
+  https://github.com/hedgehogqa/haskell-hedgehog/pull/396
+[394]:
+  https://github.com/hedgehogqa/haskell-hedgehog/pull/394
+[391]:
+  https://github.com/hedgehogqa/haskell-hedgehog/pull/391
+[390]:
+  https://github.com/hedgehogqa/haskell-hedgehog/pull/390
 [387]:
   https://github.com/hedgehogqa/haskell-hedgehog/pull/387
 [384]:
   https://github.com/hedgehogqa/haskell-hedgehog/pull/384
 [382]:
   https://github.com/hedgehogqa/haskell-hedgehog/pull/382
+[381]:
+  https://github.com/hedgehogqa/haskell-hedgehog/pull/381
 [376]:
   https://github.com/hedgehogqa/haskell-hedgehog/pull/376
 [366]:
diff --git a/hedgehog.cabal b/hedgehog.cabal
--- a/hedgehog.cabal
+++ b/hedgehog.cabal
@@ -1,4 +1,4 @@
-version: 1.0.3
+version: 1.0.4
 
 name:
   hedgehog
@@ -51,25 +51,23 @@
   build-depends:
    -- GHC 8.0.1 / base-4.9.0.0 (May 2016)
       base                            >= 4.9        && < 5
-    , ansi-terminal                   >= 0.6        && < 0.11
+    , ansi-terminal                   >= 0.6        && < 0.12
     , async                           >= 2.0        && < 2.3
-    , bytestring                      >= 0.10       && < 0.11
+    , bytestring                      >= 0.10       && < 0.12
     , concurrent-output               >= 1.7        && < 1.11
     , containers                      >= 0.4        && < 0.7
     , deepseq                         >= 1.1.0.0    && < 1.5
     , directory                       >= 1.2        && < 1.4
     , erf                             >= 2.0        && < 2.1
     , exceptions                      >= 0.7        && < 0.11
-    , fail                            >= 4.9        && < 5
     , lifted-async                    >= 0.7        && < 0.11
     , mmorph                          >= 1.0        && < 1.2
     , monad-control                   >= 1.0        && < 1.1
     , mtl                             >= 2.1        && < 2.3
     , pretty-show                     >= 1.6        && < 1.11
     , primitive                       >= 0.6        && < 0.8
-    , random                          >= 1.1        && < 1.2
+    , random                          >= 1.1        && < 1.3
     , resourcet                       >= 1.1        && < 1.3
-    , semigroups                      >= 0.16       && < 0.20
     , stm                             >= 2.4        && < 2.6
     , template-haskell                >= 2.10       && < 2.17
     , text                            >= 1.1        && < 1.3
@@ -81,9 +79,6 @@
   ghc-options:
     -Wall
 
-  if impl(ghc >= 8.0)
-    ghc-options: -Wnoncanonical-monad-instances
-
   hs-source-dirs:
     src
 
@@ -148,7 +143,6 @@
     , mmorph                          >= 1.0        && < 1.2
     , mtl                             >= 2.1        && < 2.3
     , pretty-show                     >= 1.6        && < 1.11
-    , semigroups                      >= 0.16       && < 0.20
     , text                            >= 1.1        && < 1.3
     , transformers                    >= 0.3        && < 0.6
 
diff --git a/src/Hedgehog.hs b/src/Hedgehog.hs
--- a/src/Hedgehog.hs
+++ b/src/Hedgehog.hs
@@ -112,7 +112,10 @@
   , evalM
   , evalIO
   , evalEither
+  , evalEitherM
   , evalExceptT
+  , evalMaybe
+  , evalMaybeM
 
   -- * Coverage
   , LabelName
@@ -166,7 +169,7 @@
 import           Hedgehog.Internal.Property (discard, failure, success)
 import           Hedgehog.Internal.Property (DiscardLimit, withDiscards)
 import           Hedgehog.Internal.Property (eval, evalNF, evalM, evalIO)
-import           Hedgehog.Internal.Property (evalEither, evalExceptT)
+import           Hedgehog.Internal.Property (evalEither, evalEitherM, evalExceptT, evalMaybe, evalMaybeM)
 import           Hedgehog.Internal.Property (footnote, footnoteShow)
 import           Hedgehog.Internal.Property (forAll, forAllWith)
 import           Hedgehog.Internal.Property (LabelName, MonadTest(..))
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
@@ -1190,10 +1190,13 @@
           else
             pick (n - k) xs
 
+      iis =
+        scanl1 (+) (fmap fst xs0)
+
       total =
         sum (fmap fst xs0)
 
-    n <- integral $ Range.constant 1 total
+    n <- shrink (\n -> takeWhile (< n) iis) $ integral_ $ Range.constant 1 total
     pick n xs0
 
 -- | Modifies combinators which choose from a list of generators, like 'choice'
diff --git a/src/Hedgehog/Internal/Property.hs b/src/Hedgehog/Internal/Property.hs
--- a/src/Hedgehog/Internal/Property.hs
+++ b/src/Hedgehog/Internal/Property.hs
@@ -77,7 +77,10 @@
   , evalM
   , evalIO
   , evalEither
+  , evalEitherM
   , evalExceptT
+  , evalMaybe
+  , evalMaybeM
 
   -- * Coverage
   , Coverage(..)
@@ -126,7 +129,7 @@
 
 import           Control.Applicative (Alternative(..))
 import           Control.DeepSeq (NFData, rnf)
-import           Control.Monad (MonadPlus(..))
+import           Control.Monad (MonadPlus(..), (<=<))
 import           Control.Monad.Base (MonadBase(..))
 import           Control.Monad.Catch (MonadThrow(..), MonadCatch(..))
 import           Control.Monad.Catch (SomeException(..), displayException)
@@ -754,10 +757,10 @@
 --   diff x (<=) 'r'
 -- @
 --
---   /This function behaves like the unix `diff` tool, which gives a `0` exit/
---   /code if the compared files are identical, or a `1` exit code code/
---   /otherwise. Like unix `diff`, if the arguments fail the comparison, a diff/
---   /is shown./
+--   This function behaves like the unix @diff@ tool, which gives a 0 exit
+--   code if the compared files are identical, or a 1 exit code code
+--   otherwise. Like unix @diff@, if the arguments fail the comparison, a
+--   /diff is shown.
 --
 diff :: (MonadTest m, Show a, Show b, HasCallStack) => a -> (a -> b -> Bool) -> b -> m ()
 diff x op y = do
@@ -831,12 +834,36 @@
   Right x ->
     pure x
 
+-- | Fails the test if the action throws an exception, or if the
+--   'Either' is 'Left', otherwise returns the value in the 'Right'.
+--
+evalEitherM :: (MonadTest m, Show x, MonadCatch m, HasCallStack) => m (Either x a) -> m a
+evalEitherM =
+  evalEither <=< evalM
+
 -- | Fails the test if the 'ExceptT' is 'Left', otherwise returns the value in
 --   the 'Right'.
 --
 evalExceptT :: (MonadTest m, Show x, HasCallStack) => ExceptT x m a -> m a
 evalExceptT m =
   withFrozenCallStack evalEither =<< runExceptT m
+
+-- | Fails the test if the 'Maybe' is 'Nothing', otherwise returns the value in
+--   the 'Just'.
+--
+evalMaybe :: (MonadTest m, Show a, HasCallStack) => Maybe a -> m a
+evalMaybe = \case
+  Nothing ->
+    withFrozenCallStack $ failWith Nothing "the value was Nothing"
+  Just x ->
+    pure x
+
+-- | Fails the test if the action throws an exception, or if the
+--   'Maybe' is 'Nothing', otherwise returns the value in the 'Just'.
+--
+evalMaybeM :: (MonadTest m, Show a, MonadCatch m, HasCallStack) => m (Maybe a) -> m a
+evalMaybeM =
+  evalMaybe <=< evalM
 
 ------------------------------------------------------------------------
 -- PropertyT
diff --git a/src/Hedgehog/Internal/Range.hs b/src/Hedgehog/Internal/Range.hs
--- a/src/Hedgehog/Internal/Range.hs
+++ b/src/Hedgehog/Internal/Range.hs
@@ -305,8 +305,14 @@
     n =
       toInteger n0
 
+    -- @rng@ has magnitude 1 bigger than the biggest diff
+    -- i.e. it specifies the range the diff can be in [0,rng)
+    -- with the upper bound being exclusive.
+    rng =
+      n - z + signum (n - z)
+
     diff =
-      ((n - z) * fromIntegral sz) `quot` 99
+      (rng * fromIntegral sz) `quot` 100
   in
     fromInteger $ z + diff
 
diff --git a/src/Hedgehog/Internal/Tripping.hs b/src/Hedgehog/Internal/Tripping.hs
--- a/src/Hedgehog/Internal/Tripping.hs
+++ b/src/Hedgehog/Internal/Tripping.hs
@@ -10,12 +10,12 @@
 
 -- | Test that a pair of encode / decode functions are compatible.
 --
--- Given a printer from some type 'a -> b', and a parser with a
--- potential failure case 'b -> f a'. Ensure that a valid 'a' round
--- trips through the "print" and "parse" to yield the same 'a'.
+-- Given a printer from some type @a -> b@, and a parser with a
+-- potential failure case @b -> f a@. Ensure that a valid @a@ round
+-- trips through the "print" and "parse" to yield the same @a@.
 --
--- For example, types __should__ have tripping 'Read' and 'Show'
--- instances.
+-- For example, types /should/ have tripping 'Read' and 'Show'
+-- instances:
 --
 -- @
 -- trippingShowRead :: (Show a, Read a, Eq a, MonadTest m) => a -> m ()
