diff --git a/genvalidity.cabal b/genvalidity.cabal
--- a/genvalidity.cabal
+++ b/genvalidity.cabal
@@ -1,5 +1,5 @@
 name:                genvalidity
-version:             0.2.0.0
+version:             0.2.0.1
 synopsis:            Testing utilities for the validity library
 description:         Please see README.md
 homepage:            https://github.com/NorfairKing/validity#readme
@@ -18,7 +18,7 @@
   exposed-modules:     Data.GenValidity
                      , Data.GenRelativeValidity
   build-depends:       base               < 5
-                     , validity           >= 0.2 && < 0.3
+                     , validity           >= 0.3 && < 0.4
                      , QuickCheck         >= 2.8 && < 2.9
   default-language:    Haskell2010
 
diff --git a/src/Data/GenValidity.hs b/src/Data/GenValidity.hs
--- a/src/Data/GenValidity.hs
+++ b/src/Data/GenValidity.hs
@@ -87,6 +87,66 @@
     genInvalid = genUnchecked `suchThat` (not . isValid)
     {-# MINIMAL genUnchecked #-}
 
+instance (GenValidity a, GenValidity b) => GenValidity (a, b) where
+    genUnchecked = sized $ \n -> do
+        (r, s) <- genSplit n
+        a <- resize r genUnchecked
+        b <- resize s genUnchecked
+        return (a, b)
+
+    genValid = sized $ \n -> do
+        (r, s) <- genSplit n
+        a <- resize r genValid
+        b <- resize s genValid
+        return (a, b)
+
+    genInvalid = sized $ \n -> do
+        (r, s) <- genSplit n
+        oneof
+            [ do
+                a <- resize r genUnchecked
+                b <- resize s genInvalid
+                return (a, b)
+            , do
+                a <- resize r genInvalid
+                b <- resize s genUnchecked
+                return (a, b)
+            ]
+
+instance (GenValidity a, GenValidity b, GenValidity c) => GenValidity (a, b, c) where
+    genUnchecked = sized $ \n -> do
+        (r, s, t) <- genSplit3 n
+        a <- resize r genUnchecked
+        b <- resize s genUnchecked
+        c <- resize t genUnchecked
+        return (a, b, c)
+
+    genValid = sized $ \n -> do
+        (r, s, t) <- genSplit3 n
+        a <- resize r genValid
+        b <- resize s genValid
+        c <- resize t genValid
+        return (a, b, c)
+
+    genInvalid = sized $ \n -> do
+        (r, s, t) <- genSplit3 n
+        oneof
+            [ do
+                a <- resize r genInvalid
+                b <- resize s genUnchecked
+                c <- resize t genUnchecked
+                return (a, b, c)
+            , do
+                a <- resize r genUnchecked
+                b <- resize s genInvalid
+                c <- resize t genUnchecked
+                return (a, b, c)
+            , do
+                a <- resize r genUnchecked
+                b <- resize s genUnchecked
+                c <- resize t genInvalid
+                return (a, b, c)
+            ]
 
 instance GenValidity a => GenValidity (Maybe a) where
     genUnchecked = oneof [pure Nothing, Just <$> genUnchecked]
