diff --git a/non-empty.cabal b/non-empty.cabal
--- a/non-empty.cabal
+++ b/non-empty.cabal
@@ -1,5 +1,5 @@
 Name:             non-empty
-Version:          0.3.0.1
+Version:          0.3.1
 License:          BSD3
 License-File:     LICENSE
 Author:           Henning Thielemann <haskell@henning-thielemann.de>
@@ -66,7 +66,7 @@
 Build-Type:       Simple
 
 Source-Repository this
-  Tag:         0.3.0.1
+  Tag:         0.3.1
   Type:        darcs
   Location:    http://hub.darcs.net/thielema/non-empty/
 
diff --git a/src/Data/Empty.hs b/src/Data/Empty.hs
--- a/src/Data/Empty.hs
+++ b/src/Data/Empty.hs
@@ -36,9 +36,18 @@
 
 instance C.View T where
 
+
 instance QC.Arbitrary (T a) where
    arbitrary = return Cons
    shrink _ = []
+
+instance C.Arbitrary T where
+   arbitrary = return Cons
+   shrink _ = []
+
+instance C.Gen T where
+   genOf _gen = return Cons
+
 
 instance C.Empty T where
    empty = Cons
diff --git a/src/Data/NonEmpty/Class.hs b/src/Data/NonEmpty/Class.hs
--- a/src/Data/NonEmpty/Class.hs
+++ b/src/Data/NonEmpty/Class.hs
@@ -276,6 +276,22 @@
    arbitrary = QC.arbitrary
    shrink = QC.shrink
 
+instance Arbitrary Maybe where
+   arbitrary = QC.arbitrary
+   shrink = QC.shrink
+
+
+class (Arbitrary f) => Gen f where
+   genOf :: QC.Gen a -> QC.Gen (f a)
+
+instance Gen [] where
+   genOf = QC.listOf
+
+instance Gen Maybe where
+   genOf gen = do
+      b <- QC.arbitrary
+      if b then fmap Just gen else return Nothing
+
 
 class NFData f where
    rnf :: DeepSeq.NFData a => f a -> ()
diff --git a/src/Data/NonEmptyPrivate.hs b/src/Data/NonEmptyPrivate.hs
--- a/src/Data/NonEmptyPrivate.hs
+++ b/src/Data/NonEmptyPrivate.hs
@@ -151,6 +151,11 @@
    arbitrary = fmap Aux C.arbitrary
    shrink (Aux x) = fmap Aux $ C.shrink x
 
+
+instance (C.Gen f) => C.Gen (T f) where
+   genOf gen = liftA2 Cons gen $ C.genOf gen
+
+
 {- |
 Implementation of 'Applicative.<*>' without the 'C.Empty' constraint
 that is needed for 'Applicative.pure'.
diff --git a/src/Data/Optional.hs b/src/Data/Optional.hs
--- a/src/Data/Optional.hs
+++ b/src/Data/Optional.hs
@@ -71,13 +71,27 @@
    sequenceA Nil = pure Nil
    sequenceA (Cons x xs) = liftA2 Cons x (Trav.sequenceA xs)
 
+
 instance (C.Arbitrary f, QC.Arbitrary a) => QC.Arbitrary (T f a) where
-   arbitrary =
-      QC.oneof
-         [return Nil, liftA2 Cons QC.arbitrary C.arbitrary]
-   shrink Nil = []
-   shrink (Cons x xs) =
-      P.map (\(y, Aux ys) -> Cons y ys) (QC.shrink (x, Aux xs))
+   arbitrary = arbitrary
+   shrink = shrink
+
+instance (C.Arbitrary f) => C.Arbitrary (T f) where
+   arbitrary = arbitrary
+   shrink = shrink
+
+arbitrary :: (C.Arbitrary f, QC.Arbitrary a) => QC.Gen (T f a)
+arbitrary = QC.oneof [return Nil, liftA2 Cons QC.arbitrary C.arbitrary]
+
+shrink :: (C.Arbitrary f, QC.Arbitrary a) => T f a -> [T f a]
+shrink Nil = []
+shrink (Cons x xs) = P.map (\(y, Aux ys) -> Cons y ys) (QC.shrink (x, Aux xs))
+
+instance (C.Gen f) => C.Gen (T f) where
+   genOf gen = do
+      b <- QC.arbitrary
+      if b then liftA2 Cons gen $ C.genOf gen else return Nil
+
 
 instance C.Empty (T f) where
    empty = Nil
