diff --git a/ChangeLog.md b/ChangeLog.md
--- a/ChangeLog.md
+++ b/ChangeLog.md
@@ -1,3 +1,7 @@
+## 0.2.0
+
+* Drop `blaze-builder` dependency
+
 ## 0.1.19
 
 * Update `getAddrInfo` hints to allow hostnames and portnames [#46](https://github.com/fpco/streaming-commons/issues/46)
diff --git a/Data/Streaming/Blaze.hs b/Data/Streaming/Blaze.hs
deleted file mode 100644
--- a/Data/Streaming/Blaze.hs
+++ /dev/null
@@ -1,150 +0,0 @@
-{-# LANGUAGE CPP #-}
-{-# LANGUAGE FlexibleContexts #-}
-{-# LANGUAGE BangPatterns #-}
-{-# LANGUAGE RankNTypes #-}
--- | Convert a stream of blaze-builder @Builder@s into a stream of @ByteString@s.
---
--- Adapted from blaze-builder-enumerator, written by myself and Simon Meier.
---
--- Note: if you have blaze-builder >= 0.4, 'newBlazeRecv' just calls
--- 'Data.Streaming.ByteString.Builder.newByteStringBuilderRecv'
-
--- Note that the functions here can work in any monad built on top of @IO@ or
--- @ST@.
-module Data.Streaming.Blaze
-    ( BlazeRecv
-    , BlazePopper
-    , BlazeFinish
-    , newBlazeRecv
-
-  -- * Buffers
-  , Buffer
-
-  -- ** Status information
-  , freeSize
-  , sliceSize
-  , bufferSize
-
-  -- ** Creation and modification
-  , allocBuffer
-  , reuseBuffer
-  , nextSlice
-
-  -- ** Conversion to bytestings
-  , unsafeFreezeBuffer
-  , unsafeFreezeNonEmptyBuffer
-
-  -- * Buffer allocation strategies
-  , BufferAllocStrategy
-  , allNewBuffersStrategy
-  , reuseBufferStrategy
-  , defaultStrategy
-    ) where
-
-import Blaze.ByteString.Builder
-import qualified Data.ByteString as S
-
-#if MIN_VERSION_blaze_builder(0,4,0)
-
-import Data.Streaming.ByteString.Builder
-
-newBlazeRecv :: BufferAllocStrategy -> IO (BlazeRecv, BlazeFinish)
-newBlazeRecv = newByteStringBuilderRecv
-{-# INLINE newBlazeRecv #-}
-
-#else /* !MIN_VERSION_blaze_builder(0,4,0) */
-
-import Blaze.ByteString.Builder.Internal hiding (insertByteString)
-import Blaze.ByteString.Builder.Internal.Types hiding (insertByteString)
-import Blaze.ByteString.Builder.Internal.Buffer (execBuildStep)
-import Data.IORef
-
-import Data.Streaming.ByteString.Builder.Buffer
-
-newBlazeRecv :: BufferAllocStrategy -> IO (BlazeRecv, BlazeFinish)
-newBlazeRecv (ioBufInit, nextBuf) = do
-    refBuf <- newIORef ioBufInit
-    return (push refBuf, finish refBuf)
-  where
-    finish refBuf = do
-        ioBuf <- readIORef refBuf
-        buf <- ioBuf
-        return $ unsafeFreezeNonEmptyBuffer buf
-
-    push refBuf builder = do
-        refStep <- newIORef $ Left $ unBuilder builder (buildStep finalStep)
-        return $ popper refBuf refStep
-      where
-        finalStep !(BufRange pf _) = return $ Done pf ()
-
-    popper refBuf refStep = do
-        ioBuf <- readIORef refBuf
-        ebStep <- readIORef refStep
-        case ebStep of
-            Left bStep -> do
-                !buf   <- ioBuf
-                signal <- execBuildStep bStep buf
-                case signal of
-                    Done op' _ -> do
-                        writeIORef refBuf $ return $ updateEndOfSlice buf op'
-                        return S.empty
-                    BufferFull minSize op' bStep' -> do
-                        let buf' = updateEndOfSlice buf op'
-                            {-# INLINE cont #-}
-                            cont mbs = do
-                                -- sequencing the computation of the next buffer
-                                -- construction here ensures that the reference to the
-                                -- foreign pointer `fp` is lost as soon as possible.
-                                ioBuf' <- nextBuf minSize buf'
-                                writeIORef refBuf ioBuf'
-                                writeIORef refStep $ Left bStep'
-                                case mbs of
-                                    Just bs | not $ S.null bs -> return bs
-                                    _ -> popper refBuf refStep
-                        cont $ unsafeFreezeNonEmptyBuffer buf'
-                    InsertByteString op' bs bStep' -> do
-                        let buf' = updateEndOfSlice buf op'
-                        let yieldBS = do
-                                nextBuf 1 buf' >>= writeIORef refBuf
-                                writeIORef refStep $ Left bStep'
-                                if S.null bs
-                                    then popper refBuf refStep
-                                    else return bs
-                        case unsafeFreezeNonEmptyBuffer buf' of
-                            Nothing -> yieldBS
-                            Just bs' -> do
-                                writeIORef refStep $ Right yieldBS
-                                return bs'
-            Right action -> action
-
-{-
-helper :: (MonadBase base m, PrimMonad base, Monad (t m), MonadTrans t)
-       => t m (Maybe (Flush Builder))
-       -> (Flush S.ByteString -> t m ())
-       -> BufferAllocStrategy
-       -> t m ()
-helper await' yield' (ioBufInit, nextBuf) =
-    loop ioBufInit
-  where
-    loop ioBuf = do
-        await' >>= maybe (close ioBuf) (cont' ioBuf)
-
-    cont' ioBuf Flush = push ioBuf flush $ \ioBuf' -> yield' Flush >> loop ioBuf'
-    cont' ioBuf (Chunk builder) = push ioBuf builder loop
-
-    close ioBuf = do
-        buf <- lift $ unsafeLiftIO $ ioBuf
-        maybe (return ()) (yield' . Chunk) (unsafeFreezeNonEmptyBuffer buf)
--}
-
-#endif /* !MIN_VERSION_blaze_builder(0,4,0) */
-
--- | Provides a series of @ByteString@s until empty, at which point it provides
--- an empty @ByteString@.
---
--- Since 0.1.2
-type BlazePopper = IO S.ByteString
-
-type BlazeRecv = Builder -> IO BlazePopper
-
-type BlazeFinish = IO (Maybe S.ByteString)
diff --git a/Data/Streaming/ByteString/Builder.hs b/Data/Streaming/ByteString/Builder.hs
--- a/Data/Streaming/ByteString/Builder.hs
+++ b/Data/Streaming/ByteString/Builder.hs
@@ -19,6 +19,7 @@
     ( BuilderRecv
     , BuilderPopper
     , BuilderFinish
+    , newBuilderRecv
     , newByteStringBuilderRecv
 
     -- * toByteStringIO
@@ -74,6 +75,10 @@
 type BuilderRecv = Builder -> IO BuilderPopper
 
 type BuilderFinish = IO (Maybe S.ByteString)
+
+newBuilderRecv :: BufferAllocStrategy -> IO (BuilderRecv, BuilderFinish)
+newBuilderRecv = newByteStringBuilderRecv
+{-# INLINE newBuilderRecv #-}
 
 newByteStringBuilderRecv :: BufferAllocStrategy -> IO (BuilderRecv, BuilderFinish)
 newByteStringBuilderRecv (ioBufInit, nextBuf) = do
diff --git a/Data/Streaming/ByteString/Builder/Buffer.hs b/Data/Streaming/ByteString/Builder/Buffer.hs
--- a/Data/Streaming/ByteString/Builder/Buffer.hs
+++ b/Data/Streaming/ByteString/Builder/Buffer.hs
@@ -40,8 +40,6 @@
 
 import Data.ByteString.Lazy.Internal (defaultChunkSize)
 
-#if MIN_VERSION_blaze_builder(0,4,0)
-
 import qualified Data.ByteString as S
 import qualified Data.ByteString.Internal as S
 import Foreign (Word8, ForeignPtr, Ptr, plusPtr, minusPtr)
@@ -196,13 +194,6 @@
     tryReuseBuffer reqSize buf
       | bufferSize buf >= reqSize = return $ return (reuseBuffer buf)
       | otherwise                 = return $ allocBuffer reqSize
-
-
-#else  /* !MIN_VERSION_blaze_builder(0,4,0) */
-
-import Blaze.ByteString.Builder.Internal.Buffer
-
-#endif /* !MIN_VERSION_blaze_builder(0,4,0) */
 
 defaultStrategy :: BufferAllocStrategy
 defaultStrategy = allNewBuffersStrategy defaultChunkSize
diff --git a/Data/Streaming/ByteString/Builder/Class.hs b/Data/Streaming/ByteString/Builder/Class.hs
deleted file mode 100644
--- a/Data/Streaming/ByteString/Builder/Class.hs
+++ /dev/null
@@ -1,43 +0,0 @@
-{-# LANGUAGE CPP #-}
--- | Typeclass to stream blaze-builder and bytestring(-builder) @Builder@s.
---
--- Since 0.1.10.0
---
-module Data.Streaming.ByteString.Builder.Class
-    ( StreamingBuilder (..)
-    , module Data.Streaming.ByteString.Builder
-    ) where
-
-import qualified Data.ByteString.Builder
-import qualified Data.ByteString.Builder.Internal
-import Data.Monoid (Monoid)
-
-import Data.Streaming.ByteString.Builder hiding (newByteStringBuilderRecv)
-import qualified Data.Streaming.ByteString.Builder
-
-#if !MIN_VERSION_blaze_builder(0,4,0)
-
-import qualified Blaze.ByteString.Builder
-
-import Data.Streaming.Blaze
-
-instance StreamingBuilder Blaze.ByteString.Builder.Builder where
-    newBuilderRecv = newBlazeRecv
-    builderFlush   = Blaze.ByteString.Builder.flush
-
-#endif /* !MIN_VERSION_blaze_builder(0,4,0) */
-
--- | Typeclass to stream blaze-builder (< 0.4) and bytestring(-builder) @Builder@s.
--- This is primarily to aid the transition from blaze-builder to bytestring @Builder@s
--- (if using blaze-builder >= 0.4, there is only one instance, since the @Builder@
--- type is shared).
---
--- Since 0.1.10.0
---
-class Data.Monoid.Monoid b => StreamingBuilder b where
-    newBuilderRecv :: BufferAllocStrategy -> IO (b -> IO BuilderPopper, BuilderFinish)
-    builderFlush   :: b
-
-instance StreamingBuilder Data.ByteString.Builder.Builder where
-    newBuilderRecv = Data.Streaming.ByteString.Builder.newByteStringBuilderRecv
-    builderFlush   = Data.ByteString.Builder.Internal.flush
diff --git a/streaming-commons.cabal b/streaming-commons.cabal
--- a/streaming-commons.cabal
+++ b/streaming-commons.cabal
@@ -1,5 +1,5 @@
 name:                streaming-commons
-version:             0.1.19
+version:             0.2.0.0
 synopsis:            Common lower-level functions needed by various streaming data libraries
 description:         Provides low-dependency functionality commonly needed by various streaming data libraries, such as conduit and pipes.
 homepage:            https://github.com/fpco/streaming-commons
@@ -25,10 +25,8 @@
   default: False
 
 library
-  exposed-modules:     Data.Streaming.Blaze
-                       Data.Streaming.ByteString.Builder
+  exposed-modules:     Data.Streaming.ByteString.Builder
                        Data.Streaming.ByteString.Builder.Buffer
-                       Data.Streaming.ByteString.Builder.Class
                        Data.Streaming.FileRead
                        Data.Streaming.Filesystem
                        Data.Streaming.Network
@@ -50,7 +48,6 @@
   build-depends:       base >= 4.7 && < 5
                      , array
                      , async
-                     , blaze-builder >= 0.3 && < 0.5
                      , bytestring
                      , directory
                      , network >= 2.4.0.0
@@ -85,7 +82,6 @@
     type:           exitcode-stdio-1.0
     ghc-options:    -Wall -threaded
     other-modules:  Data.Streaming.ByteString.BuilderSpec
-                    Data.Streaming.BlazeSpec
                     Data.Streaming.FileReadSpec
                     Data.Streaming.FilesystemSpec
                     Data.Streaming.NetworkSpec
@@ -99,7 +95,6 @@
                   , QuickCheck
                   , array
                   , async
-                  , blaze-builder
                   , bytestring
                   , deepseq
                   , network >= 2.4.0.0
@@ -144,7 +139,6 @@
     main-is:        builder-to-bytestring-io.hs
     ghc-options:    -Wall -O2
     build-depends:  base
-                  , blaze-builder
                   , bytestring >= 0.10.2
                   , gauge
                   , deepseq
diff --git a/test/Data/Streaming/BlazeSpec.hs b/test/Data/Streaming/BlazeSpec.hs
deleted file mode 100644
--- a/test/Data/Streaming/BlazeSpec.hs
+++ /dev/null
@@ -1,16 +0,0 @@
-{-# LANGUAGE OverloadedStrings #-}
-module Data.Streaming.BlazeSpec (spec) where
-
-import Test.Hspec
-import qualified Blaze.ByteString.Builder as B
-import Data.Streaming.ByteString.BuilderSpec hiding (spec)
-
-spec :: Spec
-spec = do
-    describe "Data.Streaming.Blaze" $ builderSpec BuilderFunctions
-        { bfFromByteString       = B.fromByteString
-        , bfInsertLazyByteString = B.insertLazyByteString
-        , bfToLazyByteString     = B.toLazyByteString
-        , bfInsertByteString     = B.insertByteString
-        , bfCopyByteString       = B.copyByteString
-        }
diff --git a/test/Data/Streaming/ByteString/BuilderSpec.hs b/test/Data/Streaming/ByteString/BuilderSpec.hs
--- a/test/Data/Streaming/ByteString/BuilderSpec.hs
+++ b/test/Data/Streaming/ByteString/BuilderSpec.hs
@@ -3,14 +3,13 @@
 {-# LANGUAGE ScopedTypeVariables #-}
 module Data.Streaming.ByteString.BuilderSpec
     ( spec
-    , builderSpec
-    , BuilderFunctions(..)
     ) where
 
 import qualified Data.ByteString as S
 import Data.ByteString.Char8 ()
 import qualified Data.ByteString.Unsafe as S
 import qualified Data.ByteString.Builder as B
+import Data.ByteString.Builder (Builder)
 import qualified Data.ByteString.Builder.Internal as B
 import qualified Data.ByteString.Lazy as L
 import Data.ByteString.Lazy.Char8 ()
@@ -21,17 +20,8 @@
 import Test.Hspec.QuickCheck (prop)
 
 import Data.Streaming.ByteString.Builder
-import Data.Streaming.ByteString.Builder.Class
 
-data BuilderFunctions b = BuilderFunctions
-    { bfFromByteString       :: S.ByteString -> b
-    , bfInsertLazyByteString :: L.ByteString -> b
-    , bfToLazyByteString     :: b -> L.ByteString
-    , bfInsertByteString     :: S.ByteString -> b
-    , bfCopyByteString       :: S.ByteString -> b
-    }
-
-tester :: StreamingBuilder b => BufferAllocStrategy -> [b] -> IO [S.ByteString]
+tester :: BufferAllocStrategy -> [Builder] -> IO [S.ByteString]
 tester strat builders0 = do
     (recv, finish) <- newBuilderRecv strat
     let loop front [] = do
@@ -47,15 +37,14 @@
             go front0
     loop id builders0
 
-testerFlush :: StreamingBuilder b
-            => BufferAllocStrategy -> [Maybe b] -> IO [Maybe S.ByteString]
+testerFlush :: BufferAllocStrategy -> [Maybe Builder] -> IO [Maybe S.ByteString]
 testerFlush strat builders0 = do
     (recv, finish) <- newBuilderRecv strat
     let loop front [] = do
             mbs <- finish
             return $ front $ maybe [] (return . Just) mbs
         loop front0 (mbu:bus) = do
-            popper <- recv $ fromMaybe builderFlush mbu
+            popper <- recv $ fromMaybe B.flush mbu
             let go front = do
                     bs <- popper
                     if S.null bs
@@ -67,55 +56,48 @@
             go front0
     loop id builders0
 
-builderSpec :: forall b. StreamingBuilder b => BuilderFunctions b -> Spec
-builderSpec BuilderFunctions{..} = do
+builderSpec :: Spec
+builderSpec = do
     prop "idempotent to toLazyByteString" $ \bss' -> do
         let bss = map S.pack bss'
-        let builders :: [b]
-            builders = map bfFromByteString bss
-        let lbs = bfToLazyByteString $ mconcat builders
+        let builders = map B.byteString bss
+        let lbs = B.toLazyByteString $ mconcat builders
         outBss <- tester defaultStrategy builders
         L.fromChunks outBss `shouldBe` lbs
 
     it "works for large input" $ do
-        let builders :: [b]
-            builders = replicate 10000 (bfFromByteString "hello world!" :: b)
-        let lbs = bfToLazyByteString $ mconcat builders
+        let builders = replicate 10000 (B.byteString "hello world!")
+        let lbs = B.toLazyByteString $ mconcat builders
         outBss <- tester defaultStrategy builders
         L.fromChunks outBss `shouldBe` lbs
 
     it "works for lazy bytestring insertion" $ do
-        let builders :: [b]
-            builders = replicate 10000 (bfInsertLazyByteString "hello world!")
-        let lbs = bfToLazyByteString $ mconcat builders
+        let builders = replicate 10000 (B.lazyByteStringInsert "hello world!")
+        let lbs = B.toLazyByteString $ mconcat builders
         outBss <- tester defaultStrategy builders
         L.fromChunks outBss `shouldBe` lbs
 
     prop "works for strict bytestring insertion" $ \bs' -> do
         let bs = S.pack bs'
-        let builders :: [b]
-            builders = replicate 10000 (bfCopyByteString bs `Data.Monoid.mappend` bfInsertByteString bs)
-        let lbs = bfToLazyByteString $ mconcat builders
+        let builders = replicate 10000 (B.byteStringCopy bs `Data.Monoid.mappend` B.byteStringInsert bs)
+        let lbs = B.toLazyByteString $ mconcat builders
         outBss <- tester defaultStrategy builders
         L.fromChunks outBss `shouldBe` lbs
 
     it "flush shouldn't bring in empty strings." $ do
         let dat = ["hello", "world"]
-            builders :: [b]
-            builders = map ((`mappend` builderFlush) . bfFromByteString) dat
+            builders = map ((`mappend` B.flush) . B.byteString) dat
         out <- tester defaultStrategy builders
         dat `shouldBe` out
 
     prop "flushing" $ \bss' -> do
         let bss = concatMap (\bs -> [Just $ S.pack bs, Nothing]) $ filter (not . null) bss'
-        let builders :: [Maybe b]
-            builders = map (fmap bfFromByteString) bss
+        let builders = map (fmap B.byteString) bss
         outBss <- testerFlush defaultStrategy builders
         outBss `shouldBe` bss
     it "large flush input" $ do
         let lbs = L.pack $ concat $ replicate 100000 [0..255]
-            chunks :: [Maybe b]
-            chunks = map (Just . bfFromByteString) (L.toChunks lbs)
+            chunks = map (Just . B.byteString) (L.toChunks lbs)
         bss <- testerFlush defaultStrategy chunks
         L.fromChunks (catMaybes bss) `shouldBe` lbs
 
@@ -123,13 +105,7 @@
 spec =
     describe "Data.Streaming.ByteString.Builder" $ do
 
-        builderSpec BuilderFunctions
-            { bfFromByteString       = B.byteString
-            , bfInsertLazyByteString = B.lazyByteStringInsert
-            , bfToLazyByteString     = B.toLazyByteString
-            , bfInsertByteString     = B.byteStringInsert
-            , bfCopyByteString       = B.byteStringCopy
-            }
+        builderSpec
 
         prop "toByteStringIO idempotent to toLazyByteString" $ \bss' -> do
             let bss = mconcat (map (B.byteString . S.pack) bss')
