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.1.0.2
+version:             0.2.0.0
 synopsis:            GenValidity support for containers
 description:         Please see README.md
 homepage:            https://github.com/NorfairKing/validity#readme
@@ -10,7 +10,6 @@
 copyright:           Copyright: (c) 2016 Tom Sydney Kerckhove
 category:            Testing
 build-type:          Simple
--- extra-source-files:
 cabal-version:       >=1.10
 
 library
@@ -19,14 +18,33 @@
       Data.GenValidity.Containers
     , Data.GenValidity.Map
     , Data.GenValidity.Tree
+    , Data.GenValidity.Sequence
+    , Data.GenValidity.Set
   build-depends:
       base       < 5
-    , validity
-    , validity-containers
-    , genvalidity
-    , containers
     , QuickCheck
+    , containers
+    , genvalidity  >= 0.3 && < 0.4
+    , validity >= 0.3 && < 0.4
+    , validity-containers >= 0.1 && < 0.2
   default-language:    Haskell2010
+
+test-suite genvalidity-containers-test
+    type: exitcode-stdio-1.0
+    main-is: Spec.hs
+    other-modules:
+        Test.Validity.ContainersSpec
+    build-depends:
+        base >=4.9 && <=5,
+        containers,
+        genvalidity,
+        genvalidity-containers,
+        genvalidity-hspec,
+        hspec >= 2.2 && < 2.3
+    default-language: Haskell2010
+    hs-source-dirs: test/
+    ghc-options: -threaded -rtsopts -with-rtsopts=-N -Wall
+
 
 source-repository head
   type:     git
diff --git a/src/Data/GenValidity/Containers.hs b/src/Data/GenValidity/Containers.hs
--- a/src/Data/GenValidity/Containers.hs
+++ b/src/Data/GenValidity/Containers.hs
@@ -3,5 +3,7 @@
     ) where
 
 import           Data.GenValidity.Map  as Containers ()
+import           Data.GenValidity.Sequence  as Containers ()
 import           Data.GenValidity.Tree as Containers
+import           Data.GenValidity.Set as Containers ()
 
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
@@ -1,15 +1,30 @@
 module Data.GenValidity.Map where
 
-import           Data.GenValidity
-import           Data.Validity.Map ()
+import Data.GenValidity
+import Data.Validity.Map ()
+import Test.QuickCheck
 
-import           Data.Map         (Map)
-import qualified Data.Map         as M
+import Data.Map (Map)
+import qualified Data.Map as M
 
-instance (Ord k, GenValidity k, GenValidity v) => GenValidity (Map k v) where
+instance (Ord k, GenUnchecked k, GenUnchecked v) =>
+         GenUnchecked (Map k v) where
     genUnchecked = M.fromList <$> genUnchecked
 
-    genValid     = M.fromList <$> genValid
-
-    genInvalid   = M.fromList <$> genInvalid
+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
+    genInvalid =
+        sized $ \n -> do
+            (k, v, m) <- genSplit3 n
+            let go g1 g2 = do
+                    key <- resize k g1
+                    val <- resize v g2
+                    rest <- resize m genUnchecked
+                    pure $ M.insert key val rest
+            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
new file mode 100644
--- /dev/null
+++ b/src/Data/GenValidity/Sequence.hs
@@ -0,0 +1,19 @@
+module Data.GenValidity.Sequence where
+
+import Data.GenValidity
+import Data.Validity.Sequence ()
+
+import Data.Sequence (Seq)
+import qualified Data.Sequence as S
+
+instance (Ord v, GenUnchecked v) =>
+         GenUnchecked (Seq v) where
+    genUnchecked = S.fromList <$> genUnchecked
+
+instance (Ord v, GenValid v) =>
+         GenValid (Seq v) where
+    genValid = S.fromList <$> genValid
+
+instance (Ord v, GenInvalid v) =>
+         GenInvalid (Seq v) where
+    genInvalid = S.fromList <$> genInvalid
diff --git a/src/Data/GenValidity/Set.hs b/src/Data/GenValidity/Set.hs
new file mode 100644
--- /dev/null
+++ b/src/Data/GenValidity/Set.hs
@@ -0,0 +1,19 @@
+module Data.GenValidity.Set where
+
+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
+    genUnchecked = S.fromList <$> genUnchecked
+
+instance (Ord v, GenValid v) =>
+         GenValid (Set v) where
+    genValid = S.fromList <$> genValid
+
+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
@@ -1,35 +1,42 @@
 module Data.GenValidity.Tree where
 
-import           Data.GenValidity
-import           Data.Validity.Tree ()
+import Data.GenValidity
+import Data.Validity.Tree ()
 
-import           Test.QuickCheck
+import Test.QuickCheck
 
-import           Data.Tree
+import Data.Tree
 
-instance GenValidity a => GenValidity (Tree a) where
+instance GenUnchecked a =>
+         GenUnchecked (Tree a) where
     genUnchecked = genTreeOf genUnchecked
 
-    genValid     = genTreeOf genValid
+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.
-    genInvalid   = sized $ \n -> do
-        size   <- upTo n
-        (a, b) <- genSplit size
-        oneof
-            [ Node <$> resize a genInvalid   <*> resize b genUnchecked
-            , Node <$> resize a genUnchecked <*> resize b genInvalid
-            ]
+-- | 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
+    genInvalid =
+        sized $ \n -> do
+            size <- upTo n
+            (a, b) <- genSplit size
+            oneof
+                [ Node <$> resize a genInvalid <*> resize b genUnchecked
+                , Node <$> resize a genUnchecked <*> resize b genInvalid
+                ]
 
 -- | Generate a tree of values that are generated as specified.
 --
 -- This takes the size parameter much better into account
 genTreeOf :: Gen a -> Gen (Tree a)
-genTreeOf func = sized $ \n -> do
-    size   <- upTo n
-    (a, b) <- genSplit size
-    value  <- resize a func
-    forest <- resize b $ genListOf $ genTreeOf func
-    return $ Node value forest
-
+genTreeOf func =
+    sized $ \n -> do
+        size <- upTo n
+        (a, b) <- genSplit size
+        value <- resize a func
+        forest <- resize b $ genListOf $ genTreeOf func
+        return $ Node value forest
diff --git a/test/Spec.hs b/test/Spec.hs
new file mode 100644
--- /dev/null
+++ b/test/Spec.hs
@@ -0,0 +1,1 @@
+{-# OPTIONS_GHC -F -pgmF hspec-discover #-}
diff --git a/test/Test/Validity/ContainersSpec.hs b/test/Test/Validity/ContainersSpec.hs
new file mode 100644
--- /dev/null
+++ b/test/Test/Validity/ContainersSpec.hs
@@ -0,0 +1,23 @@
+{-# LANGUAGE TypeApplications #-}
+
+module Test.Validity.ContainersSpec where
+
+import Test.Hspec
+
+import Data.GenValidity.Containers ()
+import Data.Map (Map)
+import Data.Sequence (Seq)
+import Data.Set (Set)
+import Data.Tree (Tree)
+import Test.Validity.GenValidity
+
+spec :: Spec
+spec = do
+    genValidSpec @(Set Int)
+    genValiditySpec @(Set Double)
+    genValidSpec @(Map Int Double)
+    genValiditySpec @(Map Double Double)
+    genValidSpec @(Tree Int)
+    genValiditySpec @(Tree Double)
+    genValidSpec @(Seq Int)
+    genValiditySpec @(Seq Double)
