diff --git a/genvalidity-hspec.cabal b/genvalidity-hspec.cabal
--- a/genvalidity-hspec.cabal
+++ b/genvalidity-hspec.cabal
@@ -2,10 +2,10 @@
 --
 -- see: https://github.com/sol/hpack
 --
--- hash: 6fe4772b4a007d5e358a91f2500b29b0161e709fcfceb3e14c58240fffa9d8e7
+-- hash: 472617010c38a3b4d88beddec1088f24b2a05528a43ad5e2ab1cc0901f21dff5
 
 name:           genvalidity-hspec
-version:        0.6.1.1
+version:        0.6.2.0
 synopsis:       Standard spec's for GenValidity instances
 description:    Note: There are companion packages for this library:
                 .
@@ -33,17 +33,6 @@
   location: https://github.com/NorfairKing/validity
 
 library
-  hs-source-dirs:
-      src
-  build-depends:
-      QuickCheck
-    , base >=4.9 && <5
-    , genvalidity >=0.5
-    , genvalidity-property >=0.2
-    , hspec
-    , hspec-core
-    , transformers
-    , validity >=0.5
   exposed-modules:
       Test.Validity
       Test.Validity.Applicative
@@ -56,15 +45,29 @@
       Test.Validity.Monoid
       Test.Validity.Ord
       Test.Validity.RelativeValidity
+      Test.Validity.Show
       Test.Validity.Shrinking
       Test.Validity.Utils
   other-modules:
       Paths_genvalidity_hspec
+  hs-source-dirs:
+      src
+  build-depends:
+      QuickCheck
+    , base >=4.9 && <5
+    , genvalidity >=0.5
+    , genvalidity-property >=0.2
+    , hspec
+    , hspec-core
+    , transformers
+    , validity >=0.5
   default-language: Haskell2010
 
 test-suite genvalidity-hspec-doctests
   type: exitcode-stdio-1.0
   main-is: DocTest.hs
+  other-modules:
+      Paths_genvalidity_hspec
   hs-source-dirs:
       doctests
   ghc-options: -threaded
@@ -74,23 +77,11 @@
     , doctest
     , genvalidity-hspec
     , hspec-core
-  other-modules:
-      Paths_genvalidity_hspec
   default-language: Haskell2010
 
 test-suite genvalidity-hspec-test
   type: exitcode-stdio-1.0
   main-is: Spec.hs
-  hs-source-dirs:
-      test/
-  ghc-options: -threaded -rtsopts -with-rtsopts=-N -Wall
-  build-depends:
-      QuickCheck
-    , base
-    , genvalidity
-    , genvalidity-hspec
-    , hspec
-    , hspec-core
   other-modules:
       Test.Validity.ApplicativeSpec
       Test.Validity.ArbitrarySpec
@@ -102,6 +93,17 @@
       Test.Validity.MonoidSpec
       Test.Validity.OrdSpec
       Test.Validity.RelativeValiditySpec
+      Test.Validity.ShowSpec
       Test.Validity.ShrinkingSpec
       Paths_genvalidity_hspec
+  hs-source-dirs:
+      test/
+  ghc-options: -threaded -rtsopts -with-rtsopts=-N -Wall
+  build-depends:
+      QuickCheck
+    , base
+    , genvalidity
+    , genvalidity-hspec
+    , hspec
+    , hspec-core
   default-language: Haskell2010
diff --git a/src/Test/Validity.hs b/src/Test/Validity.hs
--- a/src/Test/Validity.hs
+++ b/src/Test/Validity.hs
@@ -216,6 +216,11 @@
     , commutativeOnValids
     , commutative
     , commutativeOnArbitrary
+      -- * Show and Read properties
+    , showReadSpecOnValid
+    , showReadSpec
+    , showReadSpecOnArbitrary
+    , showReadSpecOnGen
       -- * Eq properties
     , eqSpecOnValid
     , eqSpecOnInvalid
@@ -265,5 +270,6 @@
 import Test.Validity.Ord
 import Test.Validity.Property
 import Test.Validity.RelativeValidity
+import Test.Validity.Show
 import Test.Validity.Shrinking
 import Test.Validity.Utils
diff --git a/src/Test/Validity/Show.hs b/src/Test/Validity/Show.hs
new file mode 100644
--- /dev/null
+++ b/src/Test/Validity/Show.hs
@@ -0,0 +1,109 @@
+{-# LANGUAGE AllowAmbiguousTypes #-}
+{-# LANGUAGE MultiParamTypeClasses #-}
+{-# LANGUAGE ScopedTypeVariables #-}
+{-# LANGUAGE TypeApplications #-}
+
+-- | 'Show' and 'Read' properties
+module Test.Validity.Show
+    ( showReadSpecOnValid
+    , showReadSpec
+    , showReadSpecOnArbitrary
+    , showReadSpecOnGen
+    , showReadRoundTripOnValid
+    , showReadRoundTrip
+    , showReadRoundTripOnArbitrary
+    , showReadRoundTripOnGen
+    ) where
+
+import Data.GenValidity
+
+import Data.Data
+
+import Text.Read
+
+import Test.Hspec
+import Test.QuickCheck
+
+import Test.Validity.Utils
+
+-- | Standard test spec for properties of Show and Read instances for valid values
+--
+-- Example usage:
+--
+-- > showReadSpecOnValid @Double
+showReadSpecOnValid ::
+       forall a. (Show a, Eq a, Read a, Typeable a, GenValid a)
+    => Spec
+showReadSpecOnValid = showReadSpecOnGen @a genValid "valid" shrinkValid
+
+-- | Standard test spec for properties of Show and Read instances for unchecked values
+--
+-- Example usage:
+--
+-- > showReadSpec @Int
+showReadSpec ::
+       forall a. (Show a, Eq a, Read a, Typeable a, GenUnchecked a)
+    => Spec
+showReadSpec = showReadSpecOnGen @a genUnchecked "unchecked" shrinkUnchecked
+
+
+-- | Standard test spec for properties of Show and Read instances for arbitrary values
+--
+-- Example usage:
+--
+-- > showReadSpecOnArbitrary @Double
+showReadSpecOnArbitrary ::
+       forall a. (Show a, Eq a, Read a, Typeable a, Arbitrary a)
+    => Spec
+showReadSpecOnArbitrary = showReadSpecOnGen @a arbitrary "arbitrary" shrink
+
+-- | Standard test spec for properties of Show and Read instances for values generated by a custom generator
+--
+-- Example usage:
+--
+-- > showReadSpecOnGen ((* 2) <$> genValid @Int) "even" (const [])
+showReadSpecOnGen ::
+       forall a. (Show a, Eq a, Read a, Typeable a)
+    => Gen a
+    -> String
+    -> (a -> [a])
+    -> Spec
+showReadSpecOnGen gen n s =
+    describe (unwords ["Show", nameOf @a, "and Read", nameOf @a]) $
+    it (unwords ["are implemented such that read . show == id for", n, "values"]) $
+    showReadRoundTripOnGen gen s
+
+-- |
+--
+-- prop> showReadRoundTripOnValid @Double
+showReadRoundTripOnValid ::
+       forall a. (Show a, Eq a, Read a, GenValid a)
+    => Property
+showReadRoundTripOnValid =
+    showReadRoundTripOnGen (genValid :: Gen a) shrinkValid
+
+-- |
+--
+-- prop> showReadRoundTrip @Int
+showReadRoundTrip ::
+       forall a. (Show a, Eq a, Read a, GenUnchecked a)
+    => Property
+showReadRoundTrip =
+    showReadRoundTripOnGen (genUnchecked :: Gen a) shrinkUnchecked
+
+-- |
+--
+-- prop> showReadRoundTripOnArbitrary @Double
+showReadRoundTripOnArbitrary ::
+       forall a. (Show a, Eq a, Read a, Arbitrary a)
+    => Property
+showReadRoundTripOnArbitrary =
+    showReadRoundTripOnGen (arbitrary :: Gen a) shrink
+
+-- |
+--
+-- prop> showReadRoundTripOnGen (abs <$> genUnchecked :: Gen Int) (const [])
+showReadRoundTripOnGen ::
+       (Show a, Eq a, Read a) => Gen a -> (a -> [a]) -> Property
+showReadRoundTripOnGen gen s =
+    forAllShrink gen s $ \v -> readMaybe (show v) `shouldBe` Just v
diff --git a/src/Test/Validity/Shrinking.hs b/src/Test/Validity/Shrinking.hs
--- a/src/Test/Validity/Shrinking.hs
+++ b/src/Test/Validity/Shrinking.hs
@@ -12,6 +12,7 @@
     , shrinkValidSpecWithLimit
     , shrinkInvalidSpec
     , shrinkValidPreservesValidOnGenValid
+    , shrinkValidPreservesValidOnGenValidWithLimit
     , shrinkInvalidPreservesInvalidOnGenInvalid
     , shrinkPreservesValidOnGenValid
     , shrinkPreservesInvalidOnGenInvalid
@@ -20,12 +21,20 @@
     , shrinkingStaysValid
     , shrinkingStaysInvalid
     , shrinkingPreserves
+    , shrinkUncheckedDoesNotShrinkToItself
+    , shrinkUncheckedDoesNotShrinkToItselfWithLimit
+    , shrinkValidDoesNotShrinkToItself
+    , shrinkValidDoesNotShrinkToItselfWithLimit
+    , shrinkInvalidDoesNotShrinkToItself
+    , shrinkInvalidDoesNotShrinkToItselfWithLimit
     ) where
 
 import Data.Data
 
 import Data.GenValidity
 
+import Control.Monad
+
 import Test.Hspec
 import Test.QuickCheck
 
@@ -33,34 +42,46 @@
 import Test.Validity.Utils
 
 shrinkValiditySpec ::
-       forall a. (Show a, Typeable a, GenValid a, GenInvalid a)
+       forall a. (Show a, Eq a, Typeable a, GenValid a, GenInvalid a)
     => Spec
 shrinkValiditySpec = do
     shrinkValidSpec @a
     shrinkInvalidSpec @a
 
 shrinkValidSpec ::
-       forall a. (Show a, Typeable a, GenValid a)
+       forall a. (Show a, Eq a, Typeable a, GenValid a)
     => Spec
 shrinkValidSpec =
-    describe ("shrinkValid :: " ++ nameOf @(a -> [a])) $
-    it "preserves validity" $ shrinkValidPreservesValidOnGenValid @a
+    describe ("shrinkValid :: " ++ nameOf @(a -> [a])) $ do
+        it "preserves validity" $
+            forAll (genValid @a) $ \a -> forM_ (shrinkValid a) shouldBeValid
+        it "never shrinks to itself for valid values" $
+            shrinkValidDoesNotShrinkToItself @a
 
 shrinkValidSpecWithLimit ::
-       forall a. (Show a, Typeable a, GenValid a)
+       forall a. (Show a, Eq a, Typeable a, GenValid a)
     => Int
     -> Spec
 shrinkValidSpecWithLimit l =
-    describe ("shrinkValid :: " ++ nameOf @(a -> [a])) $
-    it (unwords ["preserves validity for the first", show l, "elements"]) $
-    shrinkValidPreservesValidOnGenValidWithLimit @a l
+    describe ("shrinkValid :: " ++ nameOf @(a -> [a])) $ do
+        it (unwords ["preserves validity for the first", show l, "elements"]) $
+            forAll (genValid @a) $ \a -> forM_ (take l $ shrinkValid a) shouldBeValid
+        it
+            (unwords
+                 [ "never shrinks to itself for valid values for the first"
+                 , show l
+                 , "elements"
+                 ]) $
+            shrinkValidDoesNotShrinkToItselfWithLimit @a l
 
 shrinkInvalidSpec ::
        forall a. (Show a, Typeable a, GenInvalid a)
     => Spec
 shrinkInvalidSpec =
-    describe ("shrinkInvalid :: " ++ nameOf @(a -> [a])) $
-    it "preserves invalidity" $ shrinkInvalidPreservesInvalidOnGenInvalid @a
+    describe ("shrinkInvalid :: " ++ nameOf @(a -> [a])) $ do
+        it "preserves invalidity" $
+            forAll (genInvalid @a) $ \a ->
+                forM_ (shrinkInvalid a) shouldBeInvalid
 
 shrinkValidPreservesValidOnGenValid ::
        forall a. (Show a, GenValid a)
@@ -80,3 +101,41 @@
     => Property
 shrinkInvalidPreservesInvalidOnGenInvalid =
     shrinkingStaysInvalid @a genInvalid shrinkInvalid
+
+shrinkUncheckedDoesNotShrinkToItself ::
+       forall a. (Show a, Eq a, GenUnchecked a)
+    => Property
+shrinkUncheckedDoesNotShrinkToItself =
+    shrinkDoesNotShrinkToItself @a shrinkUnchecked
+
+shrinkValidDoesNotShrinkToItself ::
+       forall a. (Show a, Eq a, GenValid a)
+    => Property
+shrinkValidDoesNotShrinkToItself = shrinkDoesNotShrinkToItself @a shrinkValid
+
+shrinkInvalidDoesNotShrinkToItself ::
+       forall a. (Show a, Eq a, GenInvalid a)
+    => Property
+shrinkInvalidDoesNotShrinkToItself =
+    shrinkDoesNotShrinkToItself @a shrinkInvalid
+
+shrinkInvalidDoesNotShrinkToItselfWithLimit ::
+       forall a. (Show a, Eq a, GenInvalid a)
+    => Int
+    -> Property
+shrinkInvalidDoesNotShrinkToItselfWithLimit =
+    shrinkDoesNotShrinkToItselfWithLimit @a shrinkInvalid
+
+shrinkValidDoesNotShrinkToItselfWithLimit ::
+       forall a. (Show a, Eq a, GenValid a)
+    => Int
+    -> Property
+shrinkValidDoesNotShrinkToItselfWithLimit =
+    shrinkDoesNotShrinkToItselfWithLimit @a shrinkValid
+
+shrinkUncheckedDoesNotShrinkToItselfWithLimit ::
+       forall a. (Show a, Eq a, GenUnchecked a)
+    => Int
+    -> Property
+shrinkUncheckedDoesNotShrinkToItselfWithLimit =
+    shrinkDoesNotShrinkToItselfWithLimit @a shrinkUnchecked
diff --git a/test/Test/Validity/ShowSpec.hs b/test/Test/Validity/ShowSpec.hs
new file mode 100644
--- /dev/null
+++ b/test/Test/Validity/ShowSpec.hs
@@ -0,0 +1,32 @@
+{-# LANGUAGE TypeApplications #-}
+
+-- | Standard 'Spec's for 'Show' and 'Read' instances.
+--
+-- You will need @TypeApplications@ to use these.
+module Test.Validity.ShowSpec where
+
+import Test.Hspec
+
+import Data.GenValidity
+import Test.Validity.Show
+import Test.Validity.Utils
+
+spec :: Spec
+spec = do
+    showReadSpecOnValid @Double
+    showReadSpec @Int
+    showReadSpecOnArbitrary @Double
+    showReadSpecOnGen ((* 2) <$> genValid @Int) "even" (const [])
+    failsBecause "show and read don't have the correct semantics" $
+        showReadSpec @ShowFuncMismatch
+
+data ShowFuncMismatch =
+    ShowFuncMismatch
+    deriving (Eq, Read)
+
+instance Show ShowFuncMismatch where
+    show ShowFuncMismatch = "wrong"
+
+instance GenUnchecked ShowFuncMismatch where
+    genUnchecked = pure ShowFuncMismatch
+    shrinkUnchecked _ = []
diff --git a/test/Test/Validity/ShrinkingSpec.hs b/test/Test/Validity/ShrinkingSpec.hs
--- a/test/Test/Validity/ShrinkingSpec.hs
+++ b/test/Test/Validity/ShrinkingSpec.hs
@@ -11,10 +11,18 @@
     shrinkValiditySpec @Double
     shrinkValidSpec @Int
     shrinkInvalidSpec @Double
+    describe "shrinkUncheckedPreservesValidOnGenValid" $ do
+        it "Double" $ shrinkValidPreservesValidOnGenValid @Double
+        it "[Double]" $ shrinkValidPreservesValidOnGenValid @[Double]
     describe "shrinkValidPreservesValidOnGenValid" $ do
-        it "Int" $ shrinkValidPreservesValidOnGenValid @Int
         it "Double" $ shrinkValidPreservesValidOnGenValid @Double
         it "[Double]" $ shrinkValidPreservesValidOnGenValid @[Double]
     describe "shrinkInvalidPreservesInvalidOnGenInvalid" $ do
         it "Double" $ shrinkInvalidPreservesInvalidOnGenInvalid @Double
         it "[Double]" $ shrinkInvalidPreservesInvalidOnGenInvalid @[Double]
+    describe "shrinkUncheckedDoesNotShrinkToItself" $ do
+        it "Int" $ shrinkUncheckedDoesNotShrinkToItself @Int
+        it "[Int]" $ shrinkUncheckedDoesNotShrinkToItself @[Int]
+    describe "shrinkValidDoesNotShrinkToItself" $ do
+        it "Double" $ shrinkValidDoesNotShrinkToItself @Double
+        it "[Double]" $ shrinkValidDoesNotShrinkToItself @[Double]
