diff --git a/genvalidity-containers.cabal b/genvalidity-containers.cabal
--- a/genvalidity-containers.cabal
+++ b/genvalidity-containers.cabal
@@ -1,5 +1,5 @@
 name: genvalidity-containers
-version: 0.2.0.1
+version: 0.3.0.0
 cabal-version: >=1.10
 build-type: Simple
 license: MIT
@@ -28,9 +28,9 @@
         base <5,
         QuickCheck -any,
         containers -any,
-        genvalidity >=0.3 && <0.4,
-        validity >=0.3 && <0.4,
-        validity-containers >=0.1 && <0.2
+        genvalidity >=0.4 && <0.5,
+        validity >=0.4 && <0.5,
+        validity-containers >=0.2 && <0.3
     default-language: Haskell2010
     hs-source-dirs: src
 
diff --git a/src/Data/GenValidity/Map.hs b/src/Data/GenValidity/Map.hs
--- a/src/Data/GenValidity/Map.hs
+++ b/src/Data/GenValidity/Map.hs
@@ -13,16 +13,14 @@
 import Data.Map (Map)
 import qualified Data.Map as M
 
-instance (Ord k, GenUnchecked k, GenUnchecked v) =>
-         GenUnchecked (Map k v) where
+instance (Ord k, GenUnchecked k, GenUnchecked v) => GenUnchecked (Map k v) where
     genUnchecked = M.fromList <$> genUnchecked
+    shrinkUnchecked = fmap M.fromList . shrinkUnchecked . M.toList
 
-instance (Ord k, GenValid k, GenValid v) =>
-         GenValid (Map k v) where
+instance (Ord k, GenValid k, GenValid v) => GenValid (Map k v) where
     genValid = M.fromList <$> genValid
 
-instance (Ord k, GenInvalid k, GenInvalid v) =>
-         GenInvalid (Map k v) where
+instance (Ord k, GenInvalid k, GenInvalid v) => GenInvalid (Map k v) where
     genInvalid =
         sized $ \n -> do
             (k, v, m) <- genSplit3 n
@@ -31,6 +29,6 @@
                     val <- resize v g2
                     rest <- resize m genUnchecked
                     pure $ M.insert key val rest
-            oneof $ [go genInvalid genUnchecked, go genUnchecked genInvalid]
+            oneof [go genInvalid genUnchecked, go genUnchecked genInvalid]
     -- Note: M.fromList <$> genInvalid does not work because of this line in the Data.Map documentation:
     -- ' If the list contains more than one value for the same key, the last value for the key is retained.'
diff --git a/src/Data/GenValidity/Sequence.hs b/src/Data/GenValidity/Sequence.hs
--- a/src/Data/GenValidity/Sequence.hs
+++ b/src/Data/GenValidity/Sequence.hs
@@ -5,20 +5,19 @@
 #if !MIN_VERSION_base(4,8,0)
 import Data.Functor ((<$>))
 #endif
+import Data.Foldable (toList)
 import Data.GenValidity
 import Data.Validity.Sequence ()
 
 import Data.Sequence (Seq)
 import qualified Data.Sequence as S
 
-instance GenUnchecked v =>
-         GenUnchecked (Seq v) where
+instance GenUnchecked v => GenUnchecked (Seq v) where
     genUnchecked = S.fromList <$> genUnchecked
+    shrinkUnchecked = fmap S.fromList . shrinkUnchecked . toList
 
-instance GenValid v =>
-         GenValid (Seq v) where
+instance GenValid v => GenValid (Seq v) where
     genValid = S.fromList <$> genValid
 
-instance GenInvalid v =>
-         GenInvalid (Seq v) where
+instance GenInvalid v => GenInvalid (Seq v) where
     genInvalid = S.fromList <$> genInvalid
diff --git a/src/Data/GenValidity/Set.hs b/src/Data/GenValidity/Set.hs
--- a/src/Data/GenValidity/Set.hs
+++ b/src/Data/GenValidity/Set.hs
@@ -2,26 +2,21 @@
 {-# LANGUAGE CPP #-}
 
 module Data.GenValidity.Set where
-
 #if !MIN_VERSION_base(4,8,0)
 import Data.Functor ((<$>))
 #endif
-
-
 import Data.GenValidity
 import Data.Validity.Set ()
 
 import Data.Set (Set)
 import qualified Data.Set as S
 
-instance (Ord v, GenUnchecked v) =>
-         GenUnchecked (Set v) where
+instance (Ord v, GenUnchecked v) => GenUnchecked (Set v) where
     genUnchecked = S.fromList <$> genUnchecked
+    shrinkUnchecked = fmap S.fromList . shrinkUnchecked . S.toList
 
-instance (Ord v, GenValid v) =>
-         GenValid (Set v) where
+instance (Ord v, GenValid v) => GenValid (Set v) where
     genValid = S.fromList <$> genValid
 
-instance (Ord v, GenInvalid v) =>
-         GenInvalid (Set v) where
+instance (Ord v, GenInvalid v) => GenInvalid (Set v) where
     genInvalid = S.fromList <$> genInvalid
diff --git a/src/Data/GenValidity/Tree.hs b/src/Data/GenValidity/Tree.hs
--- a/src/Data/GenValidity/Tree.hs
+++ b/src/Data/GenValidity/Tree.hs
@@ -2,12 +2,10 @@
 {-# LANGUAGE CPP #-}
 
 module Data.GenValidity.Tree where
-
 #if !MIN_VERSION_base(4,8,0)
 import Control.Applicative ((<*>))
 import Data.Functor ((<$>))
 #endif
-
 import Data.GenValidity
 import Data.Validity.Tree ()
 
@@ -15,18 +13,17 @@
 
 import Data.Tree
 
-instance GenUnchecked a =>
-         GenUnchecked (Tree a) where
+instance GenUnchecked a => GenUnchecked (Tree a) where
     genUnchecked = genTreeOf genUnchecked
+    shrinkUnchecked (Node v ts) =
+        [Node v' ts' | (v', ts') <- shrinkUnchecked (v, ts)]
 
-instance GenValid a =>
-         GenValid (Tree a) where
+instance GenValid a => GenValid (Tree a) where
     genValid = genTreeOf genValid
 
 -- | There should be at least one invalid element, either it's here or it's
 -- further down the tree.
-instance (GenUnchecked a, GenInvalid a) =>
-         GenInvalid (Tree a) where
+instance (GenUnchecked a, GenInvalid a) => GenInvalid (Tree a) where
     genInvalid =
         sized $ \n -> do
             size <- upTo n
