diff --git a/src/Data/Splittable.hs b/src/Data/Splittable.hs
--- a/src/Data/Splittable.hs
+++ b/src/Data/Splittable.hs
@@ -11,6 +11,7 @@
 
 import qualified System.Random as R
 import Data.List (mapAccumR)
+import Data.Monoid (Dual(..))
 
 -- | Splittable datatypes are datatypes that can be used as seeds for unfolds.
 class Splittable s where
@@ -24,10 +25,12 @@
 
 -- | If a datatype is bounded and enumerable, we can use 'getInt' to produce a value from a seed.
 boundedEnum :: forall s a. (Splittable s, Bounded a, Enum a) => s -> a
-boundedEnum s = toEnum $ (getInt s `mod` (1 + ub - lb)) + lb
+boundedEnum s = toEnum $ (getInt s `mod'` (1 + ub - lb)) + lb
   where 
     lb = fromEnum (minBound :: a)
     ub = fromEnum (maxBound :: a)
+    n `mod'` 0 = n - lb
+    n `mod'` m = n `mod` m 
 
 data Left = L
 instance Splittable Left where
@@ -39,7 +42,7 @@
 instance Splittable Right where
   split = replicate
   choose fs = last fs
-  getInt R = maxBound
+  getInt R = 0
 
 instance Splittable R.StdGen where
   split 0 _ = []
@@ -72,3 +75,8 @@
   choose fs = either (choose (map (. Left) fs)) (choose (map (. Right) fs))
   getInt (Left a) = getInt a * 2
   getInt (Right a) = getInt a * 2 + 1
+
+instance Splittable s => Splittable (Dual s) where
+  split n = map Dual . reverse . split n . getDual
+  choose fs = choose (map (. Dual) $ reverse fs) . getDual
+  getInt = negate . getInt . getDual
diff --git a/src/Data/Unfoldable.hs b/src/Data/Unfoldable.hs
--- a/src/Data/Unfoldable.hs
+++ b/src/Data/Unfoldable.hs
@@ -16,6 +16,12 @@
 import Control.Applicative
 import Control.Monad.Trans.State
 import Data.Splittable
+import Data.Monoid (Dual(..))
+import Data.Functor.Compose
+import Data.Functor.Constant
+import Data.Functor.Identity
+import Data.Functor.Product
+import Data.Functor.Reverse
 
 -- | Data structures that can be unfolded.
 --
@@ -76,3 +82,17 @@
 instance (Bounded a, Enum a) => Unfoldable ((,) a) where
   unfoldMap f = spread $ (,) <$> to boundedEnum <*> to f
 
+instance Unfoldable Identity where
+  unfoldMap f = Identity . f
+
+instance (Bounded a, Enum a) => Unfoldable (Constant a) where
+  unfoldMap _ = Constant . boundedEnum
+  
+instance (Unfoldable p, Unfoldable q) => Unfoldable (Product p q) where
+  unfoldMap f = spread $ Pair <$> to (unfoldMap f) <*> to (unfoldMap f)
+
+instance (Unfoldable p, Unfoldable q) => Unfoldable (Compose p q) where
+  unfoldMap f = Compose . unfoldMap (unfoldMap f)
+
+instance Unfoldable f => Unfoldable (Reverse f) where
+  unfoldMap f = Reverse . unfoldMap (f . getDual) . Dual
diff --git a/unfoldable.cabal b/unfoldable.cabal
--- a/unfoldable.cabal
+++ b/unfoldable.cabal
@@ -1,5 +1,5 @@
 Name:                unfoldable
-Version:             0.0.0
+Version:             0.1.0
 Synopsis:            Class of data structures that can be unfolded from a seed value.
 Homepage:            https://github.com/sjoerdvisscher/unfoldable
 License:             BSD3
@@ -19,7 +19,7 @@
   
   Build-depends:
       base         >= 4   && < 5 
-    , transformers >= 0.2 && < 0.4
+    , transformers >= 0.3 && < 0.4
     , random       >= 1.0 && < 1.1
 
 source-repository head
