diff --git a/haste-compiler.cabal b/haste-compiler.cabal
--- a/haste-compiler.cabal
+++ b/haste-compiler.cabal
@@ -1,5 +1,5 @@
 Name:           haste-compiler
-Version:        0.4.4.3
+Version:        0.4.4.4
 License:        BSD3
 License-File:   LICENSE
 Synopsis:       Haskell To ECMAScript compiler
@@ -108,9 +108,8 @@
         binary,
         containers,
         data-default,
-        bytestring >= 0.9.2.1,
+        bytestring >= 0.10.4,
         utf8-string,
-        blaze-builder,
         array,
         ghc-paths,
         random,
@@ -294,12 +293,7 @@
         random,
         binary,
         data-binary-ieee754,
-        bytestring >= 0.9.2.1,
-        -- We don't use bytestring-builder directly, but its instances
-        -- propagate into Haste anyway, like it or not, so we must be able to
-        -- check which version is used to know if we should make a custom
-        -- IsString instance for Builder or not.
-        bytestring-builder,
+        bytestring,
         utf8-string,
         -- For Haste.Compiler
         shellmate >= 0.1.5,
diff --git a/src/Data/JSTarget/Optimize.hs b/src/Data/JSTarget/Optimize.hs
--- a/src/Data/JSTarget/Optimize.hs
+++ b/src/Data/JSTarget/Optimize.hs
@@ -7,6 +7,7 @@
 import Data.JSTarget.Op
 import Data.JSTarget.Traversal
 import Control.Applicative
+import Control.Monad
 import qualified Data.Map as M
 import qualified Data.Set as S
 
@@ -31,6 +32,7 @@
 topLevelInline (AST ast js) =
   flip runTravM js $ do
     unTrampoline ast
+--    return ast
     >>= inlineAssigns
     >>= optimizeArrays
     >>= optimizeThunks
@@ -307,7 +309,7 @@
 --   guaranteed to use no more stack frames than we would have without this
 --   optimization.
 unTrampoline :: Stm -> TravM Stm
-unTrampoline s = go s >>= go >>= go
+unTrampoline = go >=> go >=> go
   where
     go s = do
       ntcs <- gatherNonTailcalling s
diff --git a/src/Data/JSTarget/PP.hs b/src/Data/JSTarget/PP.hs
--- a/src/Data/JSTarget/PP.hs
+++ b/src/Data/JSTarget/PP.hs
@@ -15,8 +15,7 @@
 import qualified Data.ByteString.Lazy as BS
 import Data.JSTarget.AST (AST (..), Name (..), JumpTable, Lbl, Stm)
 import Data.JSTarget.Traversal (JSTrav)
-import Blaze.ByteString.Builder
-import Blaze.ByteString.Builder.Char.Utf8 as B
+import Data.ByteString.Builder
 
 -- | Pretty-printing options
 data PPOpts = PPOpts {
@@ -37,15 +36,6 @@
 emptyNS :: NameSupply
 emptyNS = (FinalName 0, M.empty)
 
-intDec :: Int -> Builder
-intDec = B.fromString . show
-
-doubleDec :: Double -> Builder
-doubleDec = B.fromString . show
-
-integerDec :: Integer -> Builder
-integerDec = B.fromString . show
-
 newtype PP a = PP {unPP :: PPOpts
                         -> IndentLvl
                         -> NameSupply
@@ -129,16 +119,16 @@
 -- | Turn a FinalName into a Builder.
 buildFinalName :: FinalName -> Builder
 buildFinalName (FinalName 0) =
-    B.fromString "_0"
+    fromString "_0"
 buildFinalName (FinalName fn) =
-    fromChar '_' <> go fn mempty
+    charUtf8 '_' <> go fn mempty
   where
       arrLen = 62
       chars = listArray (0,arrLen-1)
               $ "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ"
       go 0 acc = acc
       go n acc = let (rest, ix) = n `quotRem` arrLen 
-                 in go rest (fromChar (chars ! ix) <> acc)
+                 in go rest (charUtf8 (chars ! ix) <> acc)
 
 -- | Indent the given builder another step.
 indent :: PP a -> PP a
@@ -153,9 +143,9 @@
 instance Buildable Builder where
   put x = PP $ \_ _ ns _ b -> (ns, b <> x, ())
 instance Buildable String where
-  put = put . B.fromString
+  put = put . stringUtf8
 instance Buildable Char where
-  put = put . fromChar
+  put = put . charUtf8
 instance Buildable Int where
   put = put . intDec
 instance Buildable Double where
@@ -166,7 +156,8 @@
 instance Buildable Integer where
   put = put . integerDec
 instance Buildable Bool where
-  put x = put $ if x then B.fromString "true" else B.fromString "false"
+  put True  = "true"
+  put False = "false"
 
 -- | Emit indentation up to the current level.
 ind :: PP ()
@@ -194,15 +185,8 @@
 ppList _ _ =
   return ()
 
-#if MIN_VERSION_bytestring(0,10,4) || MIN_VERSION_bytestring_builder(0,10,4)
--- bytestring contains this instance from 0.10.4.0 onwards
-#else
-instance IsString Builder where
-  fromString = B.fromString
-#endif
-
 instance IsString (PP ()) where
-  fromString = put . B.fromString
+  fromString = put . stringUtf8
 
 -- | Pretty-printer class. Each part of the AST needs an instance of this.
 class Pretty a where
diff --git a/src/Data/JSTarget/Print.hs b/src/Data/JSTarget/Print.hs
--- a/src/Data/JSTarget/Print.hs
+++ b/src/Data/JSTarget/Print.hs
@@ -5,7 +5,7 @@
 import Data.JSTarget.AST
 import Data.JSTarget.Op
 import Data.JSTarget.PP as PP
-import Blaze.ByteString.Builder.Char.Utf8
+import Data.ByteString.Builder
 import Data.Monoid
 import Control.Monad
 import Data.Char
@@ -13,12 +13,12 @@
 
 instance Pretty Var where
   pp (Foreign name) =
-    put $ fromString name
+    put $ stringUtf8 name
   pp (Internal name comment) = do
     pp name
     doComment <- getOpt nameComments
     when (doComment && not (null comment)) $
-      put $ "/* " <> fromString comment <> " */"
+      put $ "/* " <> stringUtf8 comment <> " */"
 
 instance Pretty Name where
   pp name = finalNameFor name >>= put . buildFinalName
@@ -237,7 +237,7 @@
   let bparens = case b of
                   Lit (LNum n) | n < 0 -> \x -> "(".+. pp x .+. ")"
                   _                          -> parensR
-  parensL a .+. put (fromString $ show op) .+. bparens b
+  parensL a .+. put (stringUtf8 $ show op) .+. bparens b
   where
     parensL x = if expPrec x < opPrec op
                   then "(" .+. pp x .+. ")"
diff --git a/src/Haste/Config.hs b/src/Haste/Config.hs
--- a/src/Haste/Config.hs
+++ b/src/Haste/Config.hs
@@ -4,8 +4,7 @@
   safeMultiply, debugLib) where
 import Data.JSTarget
 import Control.Shell (replaceExtension, (</>))
-import Blaze.ByteString.Builder
-import Blaze.ByteString.Builder.Char.Utf8
+import Data.ByteString.Builder
 import Data.Monoid
 import Haste.Environment
 import Outputable (Outputable)
@@ -42,10 +41,10 @@
 -- | Replace the first occurrence of $HASTE_MAIN with Haste's entry point
 --   symbol.
 insertSym :: String -> AppStart
-insertSym [] _                              = fromString ""
+insertSym [] _                              = stringUtf8 ""
 insertSym str sym
-  | Just r <- stripPrefix "$HASTE_MAIN" str = sym <> fromString r
-  | (l,r) <- span (/= '$') str              = fromString l <> insertSym r sym
+  | Just r <- stripPrefix "$HASTE_MAIN" str = sym <> stringUtf8 r
+  | (l,r) <- span (/= '$') str              = stringUtf8 l <> insertSym r sym
 
 -- | Execute the program when the document has finished loading.
 startOnLoadComplete :: AppStart
diff --git a/src/Haste/Linker.hs b/src/Haste/Linker.hs
--- a/src/Haste/Linker.hs
+++ b/src/Haste/Linker.hs
@@ -9,8 +9,7 @@
 import Control.Applicative
 import Data.JSTarget
 import qualified Data.ByteString.Lazy as B
-import Blaze.ByteString.Builder
-import Blaze.ByteString.Builder.Char.Utf8
+import Data.ByteString.Builder
 import Data.Monoid
 import System.IO (hPutStrLn, stderr)
 
@@ -29,8 +28,8 @@
   ds <- getAllDefs cfg (targetLibPath cfg : libPaths cfg) mainmod pkgid mainSym
   let myDefs = if wholeProgramOpts cfg then topLevelInline ds else ds
       (progText, myMain') = prettyProg (ppOpts cfg) mainSym myDefs
-      callMain = fromString "B(A(" <> myMain' <> fromString ", [0]));"
-      launchApp = appStart cfg (fromString "hasteMain")
+      callMain = stringUtf8 "B(A(" <> myMain' <> stringUtf8 ", [0]));"
+      launchApp = appStart cfg (stringUtf8 "hasteMain")
   
   rtslibs <- mapM readFile $ rtsLibs cfg
   extlibs <- mapM readFile $ jsExternals cfg
@@ -39,19 +38,19 @@
     $ assembleProg (wrapProg cfg) extlibs rtslibs progText callMain launchApp
   where
     assembleProg True extlibs rtslibs progText callMain launchApp =
-      fromString (unlines extlibs)
-      <> fromString "var hasteMain = function() {"
-      <> fromString (unlines rtslibs)
+      stringUtf8 (unlines extlibs)
+      <> stringUtf8 "var hasteMain = function() {"
+      <> stringUtf8 (unlines rtslibs)
       <> progText
       <> callMain
-      <> fromString "};\n"
+      <> stringUtf8 "};\n"
       <> launchApp
     assembleProg _ extlibs rtslibs progText callMain launchApp =
-      fromString (unlines extlibs)
-      <> fromString (unlines rtslibs)
+      stringUtf8 (unlines extlibs)
+      <> stringUtf8 (unlines rtslibs)
       <> progText
-      <> fromString "\nvar hasteMain = function() {" <> callMain
-                                                     <> fromString "};"
+      <> stringUtf8 "\nvar hasteMain = function() {" <> callMain
+                                                     <> stringUtf8 "};"
       <> launchApp
 
 -- | Produce an info message if verbose reporting is enabled.
diff --git a/src/Haste/Version.hs b/src/Haste/Version.hs
--- a/src/Haste/Version.hs
+++ b/src/Haste/Version.hs
@@ -14,7 +14,7 @@
 
 -- | Current Haste version.
 hasteVersion :: Version
-hasteVersion = Version [0, 4, 4, 3] []
+hasteVersion = Version [0, 4, 4, 4] []
 
 -- | Current Haste version as an Int. The format of this version number is
 --   MAJOR*10 000 + MINOR*100 + MICRO.
