diff --git a/Data/Functor/Composition.hs b/Data/Functor/Composition.hs
new file mode 100644
--- /dev/null
+++ b/Data/Functor/Composition.hs
@@ -0,0 +1,14 @@
+module Data.Functor.Composition 
+  ( Composition(..) ) where
+
+import Data.Functor.Compose
+  
+-- | We often need to distinguish between various forms of Functor-like composition in Haskell in order to please the type system.
+-- This lets us work with these representations uniformly.
+class Composition o where
+  decompose :: o f g x -> f (g x)
+  compose :: f (g x) -> o f g x
+
+instance Composition Compose where
+  decompose = getCompose
+  compose = Compose
diff --git a/Data/Functor/Coproduct.hs b/Data/Functor/Coproduct.hs
--- a/Data/Functor/Coproduct.hs
+++ b/Data/Functor/Coproduct.hs
@@ -18,9 +18,12 @@
 import Control.Comonad
 import Data.Functor.Apply
 import Data.Functor.Alt
+import Data.Functor.Contravariant
 import Data.Functor.Extend
 import Data.Foldable
 import Data.Traversable
+import Data.Semigroup.Foldable
+import Data.Semigroup.Traversable
 
 newtype Coproduct f g a = Coproduct { getCoproduct :: Either (f a) (g a) }
 
@@ -39,10 +42,18 @@
 instance (Foldable f, Foldable g) => Foldable (Coproduct f g) where
   foldMap f = coproduct (foldMap f) (foldMap f)
 
+instance (Foldable1 f, Foldable1 g) => Foldable1 (Coproduct f g) where
+  foldMap1 f = coproduct (foldMap1 f) (foldMap1 f)
+
 instance (Traversable f, Traversable g) => Traversable (Coproduct f g) where
   traverse f = coproduct
     (fmap (Coproduct . Left) . traverse f)  
     (fmap (Coproduct . Right) . traverse f)
+
+instance (Traversable1 f, Traversable1 g) => Traversable1 (Coproduct f g) where
+  traverse1 f = coproduct
+    (fmap (Coproduct . Left) . traverse1 f)  
+    (fmap (Coproduct . Right) . traverse1 f)
   
 instance (Extend f, Extend g) => Extend (Coproduct f g) where
   extend f = Coproduct . coproduct
@@ -51,3 +62,6 @@
 
 instance (Comonad f, Comonad g) => Comonad (Coproduct f g) where
   extract = coproduct extract extract
+
+instance (Contravariant f, Contravariant g) => Contravariant (Coproduct f g) where
+  contramap f = Coproduct . coproduct (Left . contramap f) (Right . contramap f)
diff --git a/comonad-transformers.cabal b/comonad-transformers.cabal
--- a/comonad-transformers.cabal
+++ b/comonad-transformers.cabal
@@ -1,6 +1,6 @@
 name:          comonad-transformers
 category:      Control, Comonads
-version:       1.5.0.4
+version:       1.5.2
 license:       BSD3
 cabal-version: >= 1.6
 license-file:  LICENSE
@@ -26,6 +26,7 @@
   build-depends: 
     base >= 4 && < 4.4,
     comonad >= 1.0.1 && < 1.1,
+    contravariant >= 0.1.2 && < 0.2,
     distributive >= 0.1 && < 0.2,
     semigroupoids >= 1.1.1 && < 1.2,
     semigroups >= 0.3.4 && < 0.4,
@@ -56,5 +57,6 @@
     Control.Comonad.Trans.Traced.Memo
     Control.Comonad.Trans.Stream
     Data.Functor.Coproduct
+    Data.Functor.Composition
 
   ghc-options:      -Wall 
