diff --git a/CHANGELOG.md b/CHANGELOG.md
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -1,3 +1,7 @@
+## microstache 1.0.1.2
+
+- Drop `bytestring` dependency (there weren't direct one)
+
 ## microstache 1.0.1.1
 
 - Fix build against `transformers-0.3`
diff --git a/microstache.cabal b/microstache.cabal
--- a/microstache.cabal
+++ b/microstache.cabal
@@ -1,15 +1,17 @@
-name:                 microstache
-version:              1.0.1.1
-cabal-version:        >= 1.10
-license:              BSD3
-license-file:         LICENSE
-author:               Mark Karpov <markkarpov@openmailbox.org>, Oleg Grenrus <oleg.grenrus@iki.fi>
-maintainer:           Oleg Grenrus<oleg.grenrus@iki.fi>
-homepage:             https://github.com/phadej/microstache
-bug-reports:          https://github.com/phadej/microstache/issues
-category:             Text
-synopsis:             Mustache templates for Haskell
-build-type:           Simple
+name:               microstache
+version:            1.0.1.2
+cabal-version:      >=1.10
+license:            BSD3
+license-file:       LICENSE
+author:
+  Mark Karpov <markkarpov@openmailbox.org>, Oleg Grenrus <oleg.grenrus@iki.fi>
+
+maintainer:         Oleg Grenrus<oleg.grenrus@iki.fi>
+homepage:           https://github.com/phadej/microstache
+bug-reports:        https://github.com/phadej/microstache/issues
+category:           Text
+synopsis:           Mustache templates for Haskell
+build-type:         Simple
 description:
   Mustache templates for Haskell.
   .
@@ -18,7 +20,7 @@
 
 extra-source-files:
   CHANGELOG.md
-   README.md
+  README.md
   specification/comments.json
   specification/delimiters.json
   specification/interpolation.json
@@ -27,79 +29,87 @@
   specification/sections.json
 
 tested-with:
-  GHC==7.4.2,
-  GHC==7.6.3,
-  GHC==7.8.4,
-  GHC==7.10.3,
-  GHC==8.0.2,
-  GHC==8.2.1
+  GHC ==7.4.2
+   || ==7.6.3
+   || ==7.8.4
+   || ==7.10.3
+   || ==8.0.2
+   || ==8.2.2
+   || ==8.4.4
+   || ==8.6.5
+   || ==8.8.3
+   || ==8.10.1
 
 source-repository head
-  type:               git
-  location:           https://github.com/phadej/microstache.git
+  type:     git
+  location: https://github.com/phadej/microstache.git
 
 library
   build-depends:
-    aeson                  >=0.11    && < 1.3,
-    base                   >=4.5     && < 5.0,
-    bytestring             >=0.9.2.1 && < 0.11,
-    containers             >=0.4.2.1 && < 0.6,
-    deepseq                >=1.3.0.0 && < 1.5,
-    directory              >=1.1.0.2 && < 1.4,
-    filepath               >=1.3.0.0 && < 1.5,
-    parsec                 >=3.1.11  && < 6.0,
-    transformers           >=0.3.0.0 && < 0.6,
-    text                   >=1.2     && < 1.3,
-    unordered-containers   >= 0.2.5  && < 0.3,
-    vector                 >= 0.11   && < 0.13
-  if impl(ghc <= 7.6)
-    build-depends:
-      ghc-prim
-  if !impl(ghc >= 8.0)
-    build-depends:
-      semigroups == 0.18.*
+      aeson                 >=0.11    && <1.6
+    , base                  >=4.5     && <4.15
+    , containers            >=0.4.2.1 && <0.7
+    , deepseq               >=1.3.0.0 && <1.5
+    , directory             >=1.1.0.2 && <1.4
+    , filepath              >=1.3.0.0 && <1.5
+    , parsec                >=3.1.11  && <6.0
+    , text                  >=1.2     && <1.3
+    , transformers          >=0.3.0.0 && <0.6
+    , unordered-containers  >=0.2.5   && <0.3
+    , vector                >=0.11    && <0.13
+
+  if impl(ghc <=7.6)
+    build-depends: ghc-prim
+
+  if !impl(ghc >=8.0)
+    build-depends: semigroups >=0.18 && <0.20
+
   exposed-modules:
     Text.Microstache
     Text.Microstache.Compile
     Text.Microstache.Parser
     Text.Microstache.Render
     Text.Microstache.Type
-  hs-source-dirs:     src
-  ghc-options:        -Wall
-  default-language:   Haskell2010
 
+  hs-source-dirs:   src
+  ghc-options:      -Wall
+  default-language: Haskell2010
+
 test-suite tests
-  main-is:            Spec.hs
-  hs-source-dirs:     tests
-  type:               exitcode-stdio-1.0
+  main-is:          Spec.hs
+  hs-source-dirs:   tests
+  type:             exitcode-stdio-1.0
   build-depends:
-    hspec  >= 2.0  && < 3.0,
-    aeson,
-    base,
-    containers,
-    parsec,
-    microstache,
-    text
-  if !impl(ghc >= 8.0)
-    build-depends:
-      semigroups     == 0.18.*
-  other-modules:    
+      aeson
+    , base
+    , containers
+    , hspec        >=2.0 && <3.0
+    , microstache
+    , parsec
+    , text
+
+  if !impl(ghc >=8.0)
+    build-depends: semigroups
+
+  other-modules:
     Text.Microstache.ParserSpec
     Text.Microstache.RenderSpec
     Text.Microstache.TypeSpec
-  default-language:   Haskell2010
 
+  default-language: Haskell2010
+
 test-suite mustache-spec
-  main-is:            Spec.hs
-  hs-source-dirs:     mustache-spec
-  type:               exitcode-stdio-1.0
-  build-depends:    
-    hspec,
-    aeson,
-    base,
-    bytestring,
-    containers, 
-    parsec,
-    microstache,
-    text
-  default-language:   Haskell2010
+  main-is:          Spec.hs
+  hs-source-dirs:   mustache-spec
+  type:             exitcode-stdio-1.0
+  build-depends:
+      aeson
+    , base
+    , bytestring
+    , containers
+    , hspec
+    , microstache
+    , parsec
+    , text
+
+  default-language: Haskell2010
diff --git a/src/Text/Microstache.hs b/src/Text/Microstache.hs
--- a/src/Text/Microstache.hs
+++ b/src/Text/Microstache.hs
@@ -14,14 +14,11 @@
 -- functions to compile templates (from directory, from file, and from lazy
 -- text) and one to render them.
 --
--- The implementation uses the Megaparsec parsing library to parse the
--- templates which results in superior quality of error messages.
---
 -- For rendering you only need to create Aeson's 'Data.Aeson.Value' where
 -- you put the data to interpolate. Since the library re-uses Aeson's
 -- instances and most data types in Haskell ecosystem are instances of
 -- classes like 'Data.Aeson.ToJSON', the whole process is very simple for
--- end user.
+-- the end user.
 --
 -- Template Haskell helpers for compilation of templates at compile time are
 -- available in the "Text.Microstache.Compile.TH" module. The helpers are
@@ -41,7 +38,6 @@
 -- >
 -- > import Data.Aeson
 -- > import Data.Text
--- > import Text.Megaparsec
 -- > import Text.Microstache
 -- > import qualified Data.Text.Lazy.IO as TIO
 -- >
@@ -50,7 +46,7 @@
 -- >   let res = compileMustacheText "foo"
 -- >         "Hi, {{name}}! You have:\n{{#things}}\n  * {{.}}\n{{/things}}\n"
 -- >   case res of
--- >     Left err -> putStrLn (parseErrorPretty err)
+-- >     Left err -> print err
 -- >     Right template -> TIO.putStr $ renderMustache template $ object
 -- >       [ "name"   .= ("John" :: Text)
 -- >       , "things" .= ["pen" :: Text, "candle", "egg"]
diff --git a/src/Text/Microstache/Compile.hs b/src/Text/Microstache/Compile.hs
--- a/src/Text/Microstache/Compile.hs
+++ b/src/Text/Microstache/Compile.hs
@@ -20,16 +20,17 @@
   , compileMustacheText )
 where
 
-import Control.Exception (throwIO)
-import Control.Monad (foldM, filterM)
-import Data.Text.Lazy (Text)
+import Control.Exception       (throwIO)
+import Control.Monad           (filterM, foldM)
+import Data.Text.Lazy          (Text)
 import System.Directory
-import Text.Parsec
 import Text.Microstache.Parser
 import Text.Microstache.Type
-import qualified Data.Map          as M
+import Text.Parsec
+
+import qualified Data.Map          as Map
 import qualified Data.Text         as T
-import qualified Data.Text.Lazy.IO as TL
+import qualified Data.Text.Lazy.IO as LT
 import qualified System.FilePath   as F
 
 #if !MIN_VERSION_base(4,8,0)
@@ -49,12 +50,12 @@
   -> IO Template       -- ^ The resulting template
 compileMustacheDir pname path =
   getMustacheFilesInDir path >>=
-  fmap selectKey . foldM f (Template undefined M.empty)
+  fmap selectKey . foldM f (Template undefined Map.empty)
   where
     selectKey t = t { templateActual = pname }
     f (Template _ old) fp = do
       Template _ new <- compileMustacheFile fp
-      return (Template undefined (M.union new old))
+      return (Template undefined (Map.union new old))
 
 -- | Return a list of templates found in given directory. The returned paths
 -- are absolute.
@@ -63,7 +64,7 @@
   :: FilePath          -- ^ Directory with templates
   -> IO [FilePath]
 getMustacheFilesInDir path =
-   (getDirectoryContents path) >>=
+  getDirectoryContents path >>=
   filterM isMustacheFile . fmap (F.combine path) >>=
   mapM makeAbsolute'
 
@@ -75,10 +76,10 @@
   :: FilePath          -- ^ Location of the file
   -> IO Template
 compileMustacheFile path =
-   (TL.readFile path) >>= withException . compile
+    LT.readFile path >>= withException . compile
   where
     pname = pathToPName path
-    compile = fmap (Template pname . M.singleton pname) . parseMustache path
+    compile = fmap (Template pname . Map.singleton pname) . parseMustache path
 
 -- | Compile Mustache template from a lazy 'Text' value. The cache will
 -- contain only this template named according to given 'PName'.
@@ -88,7 +89,7 @@
   -> Text              -- ^ The template to compile
   -> Either ParseError Template -- ^ The result
 compileMustacheText pname txt =
-  Template pname . M.singleton pname <$> parseMustache "" txt
+  Template pname . Map.singleton pname <$> parseMustache "" txt
 
 ----------------------------------------------------------------------------
 -- Helpers
diff --git a/src/Text/Microstache/Parser.hs b/src/Text/Microstache/Parser.hs
--- a/src/Text/Microstache/Parser.hs
+++ b/src/Text/Microstache/Parser.hs
@@ -15,18 +15,19 @@
   ( parseMustache )
 where
 
-import Control.Applicative hiding (many)
+import Control.Applicative   hiding (many)
 import Control.Monad
-import Data.Char (isSpace, isAlphaNum)
-import Data.List (intercalate)
+import Data.Char             (isAlphaNum, isSpace)
 import Data.Functor.Identity
-import Data.Maybe (catMaybes)
-import Data.Text.Lazy (Text)
-import Text.Parsec hiding ((<|>))
-import Text.Parsec.Char ()
-import Data.Word (Word)
+import Data.List             (intercalate)
+import Data.Maybe            (catMaybes)
+import Data.Text.Lazy        (Text)
+import Data.Word             (Word)
 import Text.Microstache.Type
-import qualified Data.Text             as T
+import Text.Parsec           hiding ((<|>))
+import Text.Parsec.Char ()
+
+import qualified Data.Text as T
 
 ----------------------------------------------------------------------------
 -- Parser
diff --git a/src/Text/Microstache/Render.hs b/src/Text/Microstache/Render.hs
--- a/src/Text/Microstache/Render.hs
+++ b/src/Text/Microstache/Render.hs
@@ -11,37 +11,39 @@
 -- import the module, because "Text.Microstache" re-exports everything you may
 -- need, import that module instead.
 
-{-# LANGUAGE CPP                #-}
-{-# LANGUAGE OverloadedStrings  #-}
+{-# LANGUAGE CPP               #-}
+{-# LANGUAGE OverloadedStrings #-}
 module Text.Microstache.Render
   ( renderMustache, renderMustacheW )
 where
 
-import Control.Monad (when, forM_, unless)
+import Control.Monad              (forM_, unless, when)
+import Control.Monad.Trans.Class  (lift)
 import Control.Monad.Trans.Reader (ReaderT (..), asks, local)
+import Data.Aeson                 (Value (..), encode)
+import Data.Foldable              (asum)
+import Data.List                  (tails)
+import Data.List.NonEmpty         (NonEmpty (..))
+import Data.Monoid                (mempty)
+import Data.Semigroup             ((<>))
+import Data.Text                  (Text)
+import Data.Word                  (Word)
+import Text.Microstache.Type
+
+import qualified Data.HashMap.Strict     as HM
+import qualified Data.List.NonEmpty      as NE
+import qualified Data.Map                as Map
+import qualified Data.Text               as T
+import qualified Data.Text.Lazy          as LT
+import qualified Data.Text.Lazy.Builder  as B
+import qualified Data.Text.Lazy.Encoding as LTE
+import qualified Data.Vector             as V
+
 #if MIN_VERSION_transformers(0,4,0)
-import Control.Monad.Trans.State.Strict (State, modify', execState)
+import Control.Monad.Trans.State.Strict (State, execState, modify')
 #else
-import Control.Monad.Trans.State.Strict (State, get, put, execState)
+import Control.Monad.Trans.State.Strict (State, execState, get, put)
 #endif
-import Control.Monad.Trans.Class (lift)
-import Data.Aeson (Value (..), encode)
-import Data.Monoid (mempty)
-import Data.Semigroup ((<>))
-import Data.Foldable (asum)
-import Data.List (tails)
-import Data.List.NonEmpty (NonEmpty (..))
-import Data.Text (Text)
-import Data.Word (Word)
-import Text.Microstache.Type
-import qualified Data.HashMap.Strict    as H
-import qualified Data.List.NonEmpty     as NE
-import qualified Data.Map               as M
-import qualified Data.Text              as T
-import qualified Data.Text.Lazy         as TL
-import qualified Data.Text.Lazy.Encoding     as TL
-import qualified Data.Text.Lazy.Builder as B
-import qualified Data.Vector            as V
 
 #if !MIN_VERSION_base(4,8,0)
 import Control.Applicative
@@ -59,7 +61,7 @@
 
 -- | Synonym for the monad we use for rendering. It allows to share context
 -- and accumulate the result as 'B.Builder' data which is then turned into
--- lazy 'TL.Text'.
+-- lazy 'LT.Text'.
 
 type Render a = ReaderT RenderContext (State S) a
 
@@ -87,13 +89,13 @@
 
 -- | Render a Mustache 'Template' using Aeson's 'Value' to get actual values
 -- for interpolation.
-renderMustache :: Template -> Value -> TL.Text
+renderMustache :: Template -> Value -> LT.Text
 renderMustache t = snd . renderMustacheW t
 
 -- | Like 'renderMustache' but also return a list of warnings.
 --
 -- @since 1.0.1
-renderMustacheW :: Template -> Value -> ([MustacheWarning], TL.Text)
+renderMustacheW :: Template -> Value -> ([MustacheWarning], LT.Text)
 renderMustacheW t =
   runRender (renderPartial (templateActual t) Nothing renderNode) t
 
@@ -128,7 +130,7 @@
 -- | Run 'Render' monad given template to render and a 'Value' to take
 -- values from.
 
-runRender :: Render a -> Template -> Value -> ([MustacheWarning], TL.Text)
+runRender :: Render a -> Template -> Value -> ([MustacheWarning], LT.Text)
 runRender m t v = case execState (runReaderT m rc) (S id mempty) of
     S ws b -> (ws [], B.toLazyText b)
   where
@@ -187,7 +189,7 @@
 getNodes :: Render [Node]
 getNodes = do
   Template actual cache <- asks rcTemplate
-  return (M.findWithDefault [] actual cache)
+  return (Map.findWithDefault [] actual cache)
 {-# INLINE getNodes #-}
 
 -- | Render many nodes.
@@ -233,7 +235,7 @@
   -> Maybe Value       -- ^ Looked-up value
 simpleLookup _ (Key [])     obj        = return obj
 simpleLookup c (Key (k:ks)) (Object m) =
-  case H.lookup k m of
+  case HM.lookup k m of
     Nothing -> if c then Just Null else Nothing
     Just  v -> simpleLookup True (Key ks) v
 simpleLookup _ _ _ = Nothing
@@ -278,7 +280,7 @@
 isBlank :: Value -> Bool
 isBlank Null         = True
 isBlank (Bool False) = True
-isBlank (Object   m) = H.null m
+isBlank (Object   m) = HM.null m
 isBlank (Array    a) = V.null a
 isBlank (String   s) = T.null s
 isBlank _            = False
@@ -298,7 +300,7 @@
         render v
     _          -> render v
   where
-    render = return . TL.toStrict . TL.decodeUtf8 . encode
+    render = return . LT.toStrict . LTE.decodeUtf8 . encode
 {-# INLINE renderValue #-}
 
 -- | Escape HTML represented as strict 'Text'.
diff --git a/src/Text/Microstache/Type.hs b/src/Text/Microstache/Type.hs
--- a/src/Text/Microstache/Type.hs
+++ b/src/Text/Microstache/Type.hs
@@ -30,18 +30,19 @@
   )
 where
 
-import Data.Word (Word)
 import Control.DeepSeq
-import Control.Exception (Exception(..))
-import Data.Data (Data)
-import Data.Map (Map)
+import Control.Exception (Exception (..))
+import Data.Data         (Data)
+import Data.Map          (Map)
 import Data.Semigroup
-import Data.String (IsString (..))
-import Data.Text (Text)
-import Data.Typeable (Typeable)
+import Data.String       (IsString (..))
+import Data.Text         (Text)
+import Data.Typeable     (Typeable)
+import Data.Word         (Word)
 import GHC.Generics
 import Text.Parsec
-import qualified Data.Map  as M
+
+import qualified Data.Map  as Map
 import qualified Data.Text as T
 
 -- | Mustache template as name of “top-level” template and a collection of
@@ -62,7 +63,7 @@
   } deriving (Eq, Ord, Show, Data, Typeable, Generic)
 
 instance Semigroup Template where
-  (Template pname x) <> (Template _ y) = Template pname (M.union x y)
+  (Template pname x) <> (Template _ y) = Template pname (Map.union x y)
 
 -- | Structural element of template.
 
@@ -143,9 +144,9 @@
 
 -- | @since 1.0.1
 displayMustacheWarning :: MustacheWarning -> String
-displayMustacheWarning (MustacheVariableNotFound key) = 
+displayMustacheWarning (MustacheVariableNotFound key) =
     "Referenced value was not provided, key: " ++ T.unpack (showKey key)
-displayMustacheWarning (MustacheDirectlyRenderedValue key) = 
+displayMustacheWarning (MustacheDirectlyRenderedValue key) =
     "Complex value rendered as such, key: " ++ T.unpack (showKey key)
 
 instance Exception MustacheWarning where
