diff --git a/CHANGELOG.md b/CHANGELOG.md
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -1,5 +1,8 @@
 # Revision history for property-matchers
 
+## 0.7
+* Use the `Show` constraint on `equals` to produce a better printed `actual`, not just `expected`.
+
 ## 0.6
 * Add `Show` constraint to `equals` and other comparison properties to improve error messages in cases where rtti-derived printing is not as good.
 
diff --git a/property-matchers.cabal b/property-matchers.cabal
--- a/property-matchers.cabal
+++ b/property-matchers.cabal
@@ -1,7 +1,7 @@
 cabal-version: 2.4
 
 name: property-matchers
-version: 0.6.0.0
+version: 0.7.0.0
 synopsis: A library for tests, based on transforming and writing properties
 description:
   This package provides ways to write properties for testing such that they compose nicely and are easy to debug.
diff --git a/src/PropertyMatchers.hs b/src/PropertyMatchers.hs
--- a/src/PropertyMatchers.hs
+++ b/src/PropertyMatchers.hs
@@ -29,6 +29,7 @@
   ( Assertion
   , Boolish(..)
   , fail
+  , failPretty
   , succeed
   , branch
   , PropertyException(..)
@@ -83,6 +84,7 @@
 import qualified "prettyprinter" Prettyprinter.Render.String as PP
 import "recover-rtti" Debug.RecoverRTTI (anythingToString)
 import Data.IORef
+import qualified Prettyprinter.Render.Text as PP
 
 -- $setup
 -- >>> :set -XOverloadedStrings -XTypeApplications
@@ -128,21 +130,22 @@
 -------------------------------------------------------------------------------
 
 anythingToTextPretty :: a -> TL.Text
-anythingToTextPretty = Pretty.Simple.pStringOpt opts . anythingToString
-  where
-  opts = Pretty.Simple.defaultOutputOptionsNoColor
-    { Pretty.Simple.outputOptionsIndentAmount = 2
-    , Pretty.Simple.outputOptionsPageWidth = 120
-    , Pretty.Simple.outputOptionsCompact = True
-    , Pretty.Simple.outputOptionsCompactParens = True
-    , Pretty.Simple.outputOptionsInitialIndent = 0
-    }
+anythingToTextPretty = Pretty.Simple.pStringOpt prettyOpts . anythingToString
 
+prettyOpts :: Pretty.Simple.OutputOptions
+prettyOpts = Pretty.Simple.defaultOutputOptionsNoColor
+  { Pretty.Simple.outputOptionsIndentAmount = 2
+  , Pretty.Simple.outputOptionsPageWidth = 120
+  , Pretty.Simple.outputOptionsCompact = True
+  , Pretty.Simple.outputOptionsCompactParens = True
+  , Pretty.Simple.outputOptionsInitialIndent = 0
+  }
+
 -- | The exception thrown by properties of type `Assertion` by default.
 -- Other non-async exceptions will work fine too.
 --
 data PropertyException
-  = forall actual ann. PropertyFailed !CallStack (PP.Doc ann) actual
+  = forall actual ann. PropertyFailed !CallStack (PP.Doc ann) (Either (PP.Doc ann) actual)
   | forall actual. NoBranchMatched !CallStack actual
   deriving (Typeable)
 instance PP.Pretty PropertyException where
@@ -165,7 +168,7 @@
     <> PP.softline <> PP.unAnnotate expected
     )
   where
-  prettyActual = anythingToTextPretty actual
+  prettyActual = either (PP.renderLazy . PP.layoutSmart PP.defaultLayoutOptions) anythingToTextPretty actual
 prettyExnWithoutCallStack (NoBranchMatched _cs actual) =
   PP.group
     ( PP.line'
@@ -195,8 +198,24 @@
 -- :}
 -- Left Actual value 42 but expected something else
 fail :: HasCallStack => PP.Doc ann -> a -> IO x
-fail expected actual = throwIO (PropertyFailed (popCallStack callStack) expected actual)
+fail expected actual = throwIO $
+  PropertyFailed (popCallStack callStack) expected (Right actual)
 
+-- | Failed property. Includes documentation of the failed property,
+-- as well as the asserted-on value for printing to the user.
+-- Accepts pretty-printable values, for the cases when this is possible to do.
+--
+-- >>> let actual = 42
+-- >>> :{
+--   actual
+--     & failPretty "something else"
+--     & failureMessage
+-- :}
+-- Left Actual value 42 but expected something else
+failPretty :: (HasCallStack) => PP.Doc () -> PP.Doc () -> IO x
+failPretty expected actual = throwIO $
+  PropertyFailed (popCallStack callStack) expected (Left actual)
+
 -- | Always-successful property, equivalent to @\_ -> pure ()@.
 --
 -- >>> let actual = 42
@@ -474,42 +493,42 @@
 equals :: (HasCallStack, Show a, Eq a) => a -> Prop a
 equals expected actual
   | expected == actual = succeed actual
-  | otherwise = fail (PP.viaShow expected) actual
+  | otherwise = failPretty (PP.viaShow expected) (PP.viaShow actual)
 
 -- | The property of not being equal to some expected value.
 --
 notEquals :: (HasCallStack, Show a, Eq a) => a -> Prop a
 notEquals expected actual
   | expected /= actual = succeed actual
-  | otherwise = fail ("not equal to " <> PP.viaShow expected) actual
+  | otherwise = failPretty ("not equal to " <> PP.viaShow expected) (PP.viaShow actual)
 
 -- | The property of being less than some expected value.
 --
 lt :: (HasCallStack, Show a, Ord a) => a -> Prop a
 lt expected actual
   | actual < expected = succeed actual
-  | otherwise = fail ("less than " <> PP.viaShow expected) actual
+  | otherwise = failPretty ("less than " <> PP.viaShow expected) (PP.viaShow actual)
 
 -- | The property of being greater than some expected value.
 --
 gt :: (HasCallStack, Show a, Ord a) => a -> Prop a
 gt expected actual
   | actual > expected = succeed actual
-  | otherwise = fail ("greater than " <> PP.viaShow expected) actual
+  | otherwise = failPretty ("greater than " <> PP.viaShow expected) (PP.viaShow actual)
 
 -- | The property of being less than or equal to some expected value.
 --
 lte :: (HasCallStack, Show a, Ord a) => a -> Prop a
 lte expected actual
   | actual <= expected = succeed actual
-  | otherwise = fail ("less than/equal to " <> PP.viaShow expected) actual
+  | otherwise = failPretty ("less than/equal to " <> PP.viaShow expected) (PP.viaShow actual)
 
 -- | The property of being greater than or equal to some expected value.
 --
 gte :: (HasCallStack, Show a, Ord a) => a -> Prop a
 gte expected actual
   | actual >= expected = succeed actual
-  | otherwise = fail ("greater than/equal to " <> PP.viaShow expected) actual
+  | otherwise = failPretty ("greater than/equal to " <> PP.viaShow expected) (PP.viaShow actual)
 
 -- | Sugar for tupling.
 -- The intended use is something like
diff --git a/test/PropertyMatchersSpec.hs b/test/PropertyMatchersSpec.hs
--- a/test/PropertyMatchersSpec.hs
+++ b/test/PropertyMatchersSpec.hs
@@ -29,6 +29,8 @@
 import Debug.RecoverRTTI (anythingToString)
 import System.IO.Unsafe (unsafePerformIO)
 import Data.Text (Text)
+import qualified Data.Text.Lazy as TL
+import qualified Prettyprinter.Render.String as PP
 
 data AndOrTree = And AndOrTree AndOrTree | Or AndOrTree AndOrTree | Fail String | Error String | Succeed
   deriving stock (Generic, Show)
@@ -50,7 +52,7 @@
   Just failure -> error (show failure)
 
 pattern PropertyFailed :: Text -> String -> P.PropertyException
-pattern PropertyFailed msg actual <- P.PropertyFailed _ (PP.renderStrict . PP.layoutCompact -> msg) (anythingToString -> actual)
+pattern PropertyFailed msg actual <- P.PropertyFailed _ (PP.renderStrict . PP.layoutCompact -> msg) (either (PP.renderString . PP.layoutCompact) anythingToString -> actual)
 _PropertyFailed :: Fold P.PropertyException (Text, String)
 _PropertyFailed = to
   (\case
