diff --git a/Data/Stream/Branching.hs b/Data/Stream/Branching.hs
--- a/Data/Stream/Branching.hs
+++ b/Data/Stream/Branching.hs
@@ -31,6 +31,7 @@
 import Control.Monad
 import Data.Functor.Apply
 import Data.Stream.NonEmpty hiding (tail, tails, unfold, head, scanr, scanl)
+import Data.Distributive
 import qualified Data.Stream.NonEmpty as NonEmpty
 
 #ifdef GHC_TYPEABLE
@@ -41,6 +42,9 @@
 
 data Stream f a = a :< f (Stream f a)
 
+instance Distributive f => Distributive (Stream f) where
+  distribute w = fmap head w :< fmap distribute (distribute (fmap tail w))
+
 head :: Stream f a -> a
 head (a :< _) = a
 {-# INLINE head #-}
@@ -86,6 +90,7 @@
   (f :< fs) <*> (a :< as) = f a :< ((<*>) <$> fs <*> as)
   (f :< fs) <*  (_ :< as) = f :< ((<* ) <$> fs <*> as)
   (_ :< fs)  *> (a :< as) = a :< (( *>) <$> fs <*> as)
+
 
 unfold :: Functor f => (b -> (a, f b)) -> b -> Stream f a
 unfold f c | (x, d) <- f c = x :< fmap (unfold f) d
diff --git a/Data/Stream/Infinite.hs b/Data/Stream/Infinite.hs
--- a/Data/Stream/Infinite.hs
+++ b/Data/Stream/Infinite.hs
@@ -84,6 +84,7 @@
 import Data.Semigroup
 import Data.Foldable
 import Data.Traversable
+import Data.Distributive
 import Data.Semigroup.Traversable
 import Data.Semigroup.Foldable
 import Data.Stream.NonEmpty (NonEmpty(..))
@@ -104,6 +105,9 @@
 instance Functor Stream where
   fmap = map
   b <$ _ = repeat b
+
+instance Distributive Stream where
+  distribute w = fmap head w :> distribute (fmap tail w)
 
 -- | Extract the first element of the sequence.
 head :: Stream a -> a
diff --git a/Data/Stream/Infinite/Skew.hs b/Data/Stream/Infinite/Skew.hs
--- a/Data/Stream/Infinite/Skew.hs
+++ b/Data/Stream/Infinite/Skew.hs
@@ -45,6 +45,7 @@
 import Control.Applicative hiding (empty)
 import Control.Comonad
 import Control.Comonad.Apply
+import Data.Distributive
 import Data.Functor.Alt
 import Data.Functor.Apply
 import Data.Foldable hiding (toList)
@@ -105,6 +106,7 @@
 data Stream a = !(Complete a) :< Stream a
 --  deriving Show
 
+
 instance Show a => Show (Stream a) where
   showsPrec d as = showParen (d >= 10) $ 
     showString "fromList " . showsPrec 11 (toList as)
@@ -138,6 +140,7 @@
     (q,0) -> as !! q
     (q,_) -> bs !! q
 
+
 instance Foldable Stream where
   foldMap f (t :< ts) = foldMap f t `mappend` foldMap f ts
   foldr f z (t :< ts) = foldr f (foldr f z ts) t
@@ -154,6 +157,9 @@
 instance Traversable1 Stream where
   traverse1 f (t :< ts) = (:<) <$> traverse1 f t <.> traverse1 f ts
 
+instance Distributive Stream where
+  distribute w = tabulate (\i -> fmap (!! i) w)
+
 instance Semigroup (Stream a) where
   (<>) = (<!>)
 
@@ -179,6 +185,7 @@
 
 tabulate :: (Integer -> a) -> Stream a
 tabulate f = mapWithIndex (const . f) (pure ())
+
 
 indexed :: Stream a -> Stream (Integer, a)
 indexed = mapWithIndex (,)
diff --git a/streams.cabal b/streams.cabal
--- a/streams.cabal
+++ b/streams.cabal
@@ -1,6 +1,6 @@
 name:          streams
 category:      Control, Comonads
-version:       0.2
+version:       0.3
 license:       BSD3
 cabal-version: >= 1.6
 license-file:  LICENSE
@@ -74,7 +74,7 @@
 library
   build-depends:
     base >= 4 && < 4.4,
-    comonad >= 0.6.0 && < 0.7,
+    comonad >= 0.6.2.1 && < 0.7,
     functor-apply >= 0.7.4 && < 0.8,
     semigroups >= 0.3.2 && < 0.4
 
