diff --git a/ChangeLog.md b/ChangeLog.md
--- a/ChangeLog.md
+++ b/ChangeLog.md
@@ -1,3 +1,8 @@
+## 1.2.10
+
+* Add `PrimMonad` instances for `ConduitM` and `Pipe`
+  [#306](https://github.com/snoyberg/conduit/pull/306)
+
 ## 1.2.9.1
 
 * Ensure downstream and inner sink receive same inputs in
diff --git a/Data/Conduit/Internal/Conduit.hs b/Data/Conduit/Internal/Conduit.hs
--- a/Data/Conduit/Internal/Conduit.hs
+++ b/Data/Conduit/Internal/Conduit.hs
@@ -8,6 +8,7 @@
 {-# LANGUAGE RankNTypes #-}
 {-# LANGUAGE TupleSections #-}
 {-# LANGUAGE Trustworthy #-}
+{-# LANGUAGE TypeFamilies #-}
 module Data.Conduit.Internal.Conduit
     ( -- ** Types
       ConduitM (..)
@@ -98,6 +99,7 @@
 import Control.Monad.Trans.Class (MonadTrans (lift))
 import Control.Monad.IO.Class (MonadIO (liftIO))
 import Control.Monad.Base (MonadBase (liftBase))
+import Control.Monad.Primitive (PrimMonad, PrimState, primitive)
 import Data.Void (Void, absurd)
 import Data.Monoid (Monoid (mappend, mempty))
 import Control.Monad.Trans.Resource
@@ -250,6 +252,10 @@
     {-# INLINE mempty #-}
     mappend = (>>)
     {-# INLINE mappend #-}
+
+instance PrimMonad m => PrimMonad (ConduitM i o m) where
+  type PrimState (ConduitM i o m) = PrimState m
+  primitive = lift . primitive
 
 -- | Provides a stream of output values, without consuming any input or
 -- producing a final result.
diff --git a/Data/Conduit/Internal/Pipe.hs b/Data/Conduit/Internal/Pipe.hs
--- a/Data/Conduit/Internal/Pipe.hs
+++ b/Data/Conduit/Internal/Pipe.hs
@@ -7,6 +7,7 @@
 {-# LANGUAGE RankNTypes #-}
 {-# LANGUAGE TupleSections #-}
 {-# LANGUAGE Trustworthy #-}
+{-# LANGUAGE TypeFamilies #-}
 module Data.Conduit.Internal.Pipe
     ( -- ** Types
       Pipe (..)
@@ -55,6 +56,7 @@
 import Control.Monad.Trans.Class (MonadTrans (lift))
 import Control.Monad.IO.Class (MonadIO (liftIO))
 import Control.Monad.Base (MonadBase (liftBase))
+import Control.Monad.Primitive (PrimMonad, PrimState, primitive)
 import Data.Void (Void, absurd)
 import Data.Monoid (Monoid (mappend, mempty))
 import Control.Monad.Trans.Resource
@@ -154,6 +156,10 @@
     {-# INLINE mempty #-}
     mappend = (>>)
     {-# INLINE mappend #-}
+
+instance PrimMonad m => PrimMonad (Pipe l i o u m) where
+  type PrimState (Pipe l i o u m) = PrimState m
+  primitive = lift . primitive
 
 instance MonadResource m => MonadResource (Pipe l i o u m) where
     liftResourceT = lift . liftResourceT
diff --git a/conduit.cabal b/conduit.cabal
--- a/conduit.cabal
+++ b/conduit.cabal
@@ -1,5 +1,5 @@
 Name:                conduit
-Version:             1.2.9.1
+Version:             1.2.10
 Synopsis:            Streaming data processing library.
 description:
     `conduit` is a solution to the streaming data problem, allowing for production,
@@ -42,6 +42,7 @@
                      , mtl
                      , mmorph
                      , monad-control
+                     , primitive
   if !impl(ghc>=7.9)
     build-depends:   void                     >= 0.5.5
   ghc-options:         -Wall
