diff --git a/hspec-wai.cabal b/hspec-wai.cabal
--- a/hspec-wai.cabal
+++ b/hspec-wai.cabal
@@ -1,11 +1,11 @@
 cabal-version: 1.12
 
--- This file has been generated from package.yaml by hpack version 0.34.3.
+-- This file has been generated from package.yaml by hpack version 0.39.1.
 --
 -- see: https://github.com/sol/hpack
 
 name:             hspec-wai
-version:          0.11.1
+version:          0.12.1
 homepage:         https://github.com/hspec/hspec-wai#readme
 bug-reports:      https://github.com/hspec/hspec-wai/issues
 license:          MIT
@@ -32,7 +32,8 @@
       src
   ghc-options: -Wall
   build-depends:
-      QuickCheck
+      HUnit
+    , QuickCheck
     , base >=4.9.1.0 && <5
     , base-compat
     , bytestring >=0.10
@@ -43,7 +44,7 @@
     , text
     , transformers
     , wai >=3
-    , wai-extra >=3
+    , wai-extra >=3.1.14
   exposed-modules:
       Test.Hspec.Wai
       Test.Hspec.Wai.QuickCheck
@@ -61,8 +62,11 @@
       src
       test
   ghc-options: -Wall
+  build-tool-depends:
+      hspec-discover:hspec-discover
   build-depends:
-      QuickCheck
+      HUnit
+    , QuickCheck
     , base >=4.9.1.0 && <5
     , base-compat
     , bytestring >=0.10
@@ -74,7 +78,7 @@
     , text
     , transformers
     , wai >=3.2.2
-    , wai-extra >=3
+    , wai-extra >=3.1.14
   other-modules:
       Test.Hspec.Wai
       Test.Hspec.Wai.Internal
diff --git a/src/Test/Hspec/Wai.hs b/src/Test/Hspec/Wai.hs
--- a/src/Test/Hspec/Wai.hs
+++ b/src/Test/Hspec/Wai.hs
@@ -1,3 +1,5 @@
+{-# LANGUAGE TupleSections #-}
+{-# LANGUAGE PackageImports #-}
 {-# LANGUAGE OverloadedStrings #-}
 {-# LANGUAGE FlexibleContexts #-}
 {-# LANGUAGE ConstraintKinds #-}
@@ -36,23 +38,30 @@
 , getState
 , pending
 , pendingWith
+, annotate
+, SResponse(..)
 ) where
 
 import           Prelude ()
-import           Prelude.Compat
+import "base-compat" Prelude.Compat
 
 import           Data.Foldable
 import           Data.ByteString (ByteString)
 import qualified Data.ByteString.Lazy as LB
+import           Control.Exception (Exception, handle, throwIO)
 import           Control.Monad.IO.Class
 import           Control.Monad.Trans.Class (lift)
+import           Control.Monad.Trans.Reader
+import           Control.Monad.Trans.State (StateT(..))
+
 import           Network.Wai (Request(..))
 import           Network.HTTP.Types
 import           Network.Wai.Test hiding (request)
 import qualified Network.Wai.Test as Wai
+import           Test.HUnit.Lang (HUnitFailure(..), FailureReason(..))
 import           Test.Hspec.Expectations
 
-import           Test.Hspec.Core.Spec hiding (pending, pendingWith)
+import           Test.Hspec.Core.Spec hiding (pending, pendingWith, FailureReason(..))
 import qualified Test.Hspec.Core.Spec as Core
 import           Test.Hspec.Core.Hooks
 
@@ -71,6 +80,40 @@
 -- | A lifted version of `Core.pending`.
 pending :: WaiSession st ()
 pending = liftIO Core.pending
+
+-- | -- If you have a test case that has multiple assertions, you can use the
+-- 'annotate' function to provide a string message that will be attached to the
+-- 'Expectation'.
+--
+-- @
+-- describe "annotate" $ do
+--   it "adds the message" $ do
+--     annotate "obvious falsehood" $ do
+--       True `shouldBe` False
+--
+-- ========>
+--
+-- 1) annotate, adds the message
+--       obvious falsehood
+--       expected: False
+--        but got: True
+-- @
+annotate :: String -> WaiSession st a -> WaiSession st a
+annotate message = handleWai $ \ (HUnitFailure loc reason) -> throwIO . HUnitFailure loc $ case reason of
+  Reason err -> Reason $ addMessage err
+  ExpectedButGot err expected got -> ExpectedButGot (Just $ maybe message addMessage err) expected got
+  where
+    addMessage :: String -> String
+    addMessage err
+      | null err = message
+      | otherwise = message ++ "\n" ++ err
+
+    handleWai :: Exception e => (e -> IO a) -> WaiSession st a -> WaiSession st a
+    handleWai k (WaiSession (ReaderT f)) = WaiSession $ ReaderT $ \st ->
+      ReaderT $ \app -> do
+        case flip runReaderT app $ f st of
+          StateT runSt -> StateT $ \s ->
+            handle (fmap (, s) . k) $ runSt s
 
 -- | A lifted version of `Core.pendingWith`.
 pendingWith :: String -> WaiSession st ()
diff --git a/src/Test/Hspec/Wai/Internal.hs b/src/Test/Hspec/Wai/Internal.hs
--- a/src/Test/Hspec/Wai/Internal.hs
+++ b/src/Test/Hspec/Wai/Internal.hs
@@ -22,7 +22,7 @@
 import           Test.Hspec.Core.Spec
 import           Test.Hspec.Wai.Util (formatHeader)
 
-#if MIN_VERSION_base(4,9,0)
+#if MIN_VERSION_base(4,9,0) && !MIN_VERSION_base(4,13,0)
 import           Control.Monad.Fail
 #endif
 
diff --git a/src/Test/Hspec/Wai/Matcher.hs b/src/Test/Hspec/Wai/Matcher.hs
--- a/src/Test/Hspec/Wai/Matcher.hs
+++ b/src/Test/Hspec/Wai/Matcher.hs
@@ -1,3 +1,4 @@
+{-# LANGUAGE PackageImports #-}
 {-# LANGUAGE ViewPatterns #-}
 module Test.Hspec.Wai.Matcher (
   ResponseMatcher(..)
@@ -11,7 +12,7 @@
 ) where
 
 import           Prelude ()
-import           Prelude.Compat
+import "base-compat" Prelude.Compat
 
 import           Control.Monad
 import           Data.Maybe
