diff --git a/QuickCheckVariant.cabal b/QuickCheckVariant.cabal
--- a/QuickCheckVariant.cabal
+++ b/QuickCheckVariant.cabal
@@ -2,7 +2,7 @@
 -- PVP summary:      +-+------- breaking API changes
 --                   | | +----- non-breaking API additions
 --                   | | | +--- code changes with no API change
-version:             0.1.0.3
+version:             0.1.0.4
 synopsis:            Generator of "valid" and "invalid" data in a type class
 description:         Generator of "valid" and "invalid" data in a type class
 homepage:            https://github.com/sanjorgek/QuickCheckVariant
diff --git a/src/Test/QuickCheck/Variant.hs b/src/Test/QuickCheck/Variant.hs
--- a/src/Test/QuickCheck/Variant.hs
+++ b/src/Test/QuickCheck/Variant.hs
@@ -19,9 +19,18 @@
 >>> instance (Varaint a) => Arbitrary a where {arbitrary = oneof [valid, invalid]}
 -}
 class Variant a where
+  -- |Get a generator of valid random data type
   valid   :: Gen a
+  -- |Get a generator of invalid random data type
   invalid :: Gen a
 
+{-|
+Variant of a list.
+
+A valid list only had valid data.
+
+A invalid list had only invalid data or some valid data with invalid data.
+-}
 instance (Variant a) => Variant [a] where
   valid = do
     x <- valid
@@ -30,8 +39,15 @@
   invalid = do
     x <- invalid
     xs <- invalid
-    (oneof . map return) [[], [x], x:xs]
+    y <- valid
+    ys <- valid
+    (oneof . map return) [[x], x:xs, x:ys, y:xs]
 
+{-|
+Variant Maybe
+
+Only Just data can be invalid, nothing always is valid.
+-}
 instance (Variant a) => Variant (Maybe a) where
   invalid = do
     x <- invalid
@@ -40,6 +56,9 @@
     x <- valid
     (oneof . map return) [Nothing, Just x]
 
+{-|
+Varaint Either.
+-}
 instance (Variant a, Variant b) => Variant (Either a b) where
   invalid = do
     x <- invalid
@@ -50,24 +69,43 @@
     y <- valid
     (oneof . map return) [Left x, Right y]
 
+{-|
+Varaint tuple
+
+Invalid tuple may had some valid data with invalid data or only invalid data.
+
+Valid tuple had only valid data.
+-}
 instance (Variant a, Variant b) => Variant ((,) a b) where
   invalid = do
     x <- invalid
     y <- invalid
-    return (x, y)
+    z <- valid
+    w <- valid
+    (oneof . map return) [(x,y), (x,z), (w,y)]
   valid = do
     x <- valid
     y <- valid
     return (x, y)
 
+{-|
+Varaint 3-tuple
+
+Invalid 3-tuple may had some valid data with invalid data or only invalid data.
+
+Valid 3-tuple had only valid data.
+-}
 instance (Variant a, Variant b, Variant c) => Variant ((,,) a b c) where
   invalid = do
     x <- invalid
     y <- invalid
     z <- invalid
-    return (x, y, z)
+    w <- valid
+    v <- valid
+    u <- valid 
+    (oneof . map return) [(x,y,z), (x,y,u), (x,v,z), (w,y,z), (w,v,z), (x,v,u), (w,y,u)]
   valid = do
     x <- valid
     y <- valid
-    z <- invalid    
+    z <- valid    
     return (x, y, z)
