diff --git a/json-bytes-builder.cabal b/json-bytes-builder.cabal
--- a/json-bytes-builder.cabal
+++ b/json-bytes-builder.cabal
@@ -1,7 +1,7 @@
 name:
   json-bytes-builder
 version:
-  0.2.1
+  0.2.1.1
 synopsis:
   Direct-to-bytes JSON Builder
 description:
@@ -45,8 +45,8 @@
     Haskell2010
   other-modules:
     JSONBytesBuilder.Prelude
-    JSONBytesBuilder.BoundedPrims
-    JSONBytesBuilder.Builders
+    JSONBytesBuilder.ByteString.BoundedPrims
+    JSONBytesBuilder.ByteString.Builders
   exposed-modules:
     JSONBytesBuilder.Builder
     JSONBytesBuilder.Interpreters.ByteStringBuilder
@@ -58,5 +58,5 @@
     bytestring == 0.10.*,
     semigroups >= 0.16 && < 0.20,
     base-prelude < 2,
-    base >= 4.6 && < 5
+    base >= 4.7 && < 5
 
diff --git a/library/JSONBytesBuilder/BoundedPrims.hs b/library/JSONBytesBuilder/BoundedPrims.hs
deleted file mode 100644
--- a/library/JSONBytesBuilder/BoundedPrims.hs
+++ /dev/null
@@ -1,72 +0,0 @@
-module JSONBytesBuilder.BoundedPrims
-where
-
-import JSONBytesBuilder.Prelude
-import Data.ByteString.Builder.Prim
-
-
-{-# INLINE null #-}
-null :: BoundedPrim ()
-null =
-  ascii4 ('n', ('u', ('l', 'l')))
-
-{-# INLINE boolean #-}
-boolean :: BoundedPrim Bool
-boolean =
-  condB id (ascii4 ('t', ('r', ('u', 'e')))) (ascii5 ('f', ('a', ('l', ('s', 'e')))))
-
-{-# INLINE emptyArray #-}
-emptyArray :: BoundedPrim ()
-emptyArray =
-  ascii2 ('[', ']')
-
-{-# INLINE emptyObject #-}
-emptyObject :: BoundedPrim ()
-emptyObject =
-  ascii2 ('{', '}')
-
-{-# INLINE stringEncodedByte #-}
-stringEncodedByte :: BoundedPrim Word8
-stringEncodedByte =
-  condB (== (fromIntegral . ord) '\\') (ascii2 ('\\', '\\')) $
-  condB (== (fromIntegral . ord) '\"') (ascii2 ('\\', '"')) $
-  condB (>= (fromIntegral . ord) '\x20') (liftFixedToBounded word8) $
-  condB (== (fromIntegral . ord) '\n') (ascii2 ('\\', 'n')) $
-  condB (== (fromIntegral . ord) '\r') (ascii2 ('\\', 'r')) $
-  condB (== (fromIntegral . ord) '\t') (ascii2 ('\\', 't')) $
-  hexEncodedByte
-
-{-# INLINE hexEncodedByte #-}
-hexEncodedByte :: BoundedPrim Word8
-hexEncodedByte =
-  liftFixedToBounded ((\c -> ('\\', ('u', fromIntegral c))) >$< char8 >*< char8 >*< word16HexFixed)
-
-{-# INLINE ascii2 #-}
-ascii2 :: (Char, Char) -> BoundedPrim a
-ascii2 cs =
-  liftFixedToBounded $
-  const cs >$< char8 >*< char8
-
-{-# INLINE ascii4 #-}
-ascii4 :: (Char, (Char, (Char, Char))) -> BoundedPrim a
-ascii4 cs =
-  liftFixedToBounded $
-  const cs >$< char8 >*< char8 >*< char8 >*< char8
-
-{-# INLINE ascii5 #-}
-ascii5 :: (Char, (Char, (Char, (Char, Char)))) -> BoundedPrim a
-ascii5 cs =
-  liftFixedToBounded $
-  const cs >$< char8 >*< char8 >*< char8 >*< char8 >*< char8
-
-{-# INLINE ascii6 #-}
-ascii6 :: (Char, (Char, (Char, (Char, (Char, Char))))) -> BoundedPrim a
-ascii6 cs =
-  liftFixedToBounded $ 
-  const cs >$< char8 >*< char8 >*< char8 >*< char8 >*< char8 >*< char8
-
-{-# INLINE ascii8 #-}
-ascii8 :: (Char, (Char, (Char, (Char, (Char, (Char, (Char, Char))))))) -> BoundedPrim a
-ascii8 cs =
-  liftFixedToBounded $
-  const cs >$< char8 >*< char8 >*< char8 >*< char8 >*< char8 >*< char8 >*< char8 >*< char8
diff --git a/library/JSONBytesBuilder/Builder.hs b/library/JSONBytesBuilder/Builder.hs
--- a/library/JSONBytesBuilder/Builder.hs
+++ b/library/JSONBytesBuilder/Builder.hs
@@ -1,5 +1,8 @@
+-- |
+-- DSL for construction of JSON.
 module JSONBytesBuilder.Builder
 (
+  -- ** JSON builders
   JSON,
   null,
   boolean,
@@ -10,8 +13,10 @@
   string,
   object,
   array,
+  -- ** Object builders
   Object,
   row,
+  -- ** Array builders
   Array,
   element,
 )
@@ -19,12 +24,16 @@
 
 import JSONBytesBuilder.Prelude hiding (null)
 import qualified Data.ByteString.Builder as A
-import qualified JSONBytesBuilder.Builders as E
+import qualified JSONBytesBuilder.ByteString.Builders as E
 
 
+-- |
+-- Builder of any JSON value.
 newtype JSON =
   JSON A.Builder
 
+-- |
+-- Builder of a JSON Object value.
 newtype Object =
   Object (Maybe A.Builder)
 
@@ -44,6 +53,8 @@
       Object Nothing ->
         id
 
+-- |
+-- Builder of a JSON Array value.
 newtype Array =
   Array (Maybe A.Builder)
 
@@ -63,56 +74,86 @@
       Array Nothing ->
         id
 
+-- |
+-- JSON Null literal.
 {-# INLINE null #-}
 null :: JSON
 null =
   JSON (inline E.null)
 
+-- |
+-- JSON Boolean literal from 'Bool'.
 {-# INLINE boolean #-}
 boolean :: Bool -> JSON
 boolean =
   JSON . inline E.boolean
 
+-- |
+-- JSON Number literal from 'Int'.
 {-# INLINE number_int #-}
 number_int :: Int -> JSON
 number_int =
   JSON . inline A.intDec
 
+-- |
+-- JSON Number literal from 'Integer'.
 {-# INLINE number_integer #-}
 number_integer :: Integer -> JSON
 number_integer =
   JSON . inline A.integerDec
 
+-- |
+-- JSON Number literal from 'Double'.
 {-# INLINE number_double #-}
 number_double :: Double -> JSON
 number_double =
   JSON . inline A.doubleDec
 
+-- |
+-- JSON Number literal from 'Scientific'.
 {-# INLINE number_scientific #-}
 number_scientific :: Scientific -> JSON
 number_scientific =
   JSON . inline E.scientific
 
+-- |
+-- JSON String literal from 'Text'.
 {-# INLINE string #-}
 string :: Text -> JSON
 string =
   JSON . inline E.string
 
+-- |
+-- JSON Object literal from the 'Object' builder.
 {-# INLINE object #-}
 object :: Object -> JSON
 object (Object x) =
   JSON (maybe E.emptyObject (inline E.inCurlies) x)
 
+-- |
+-- JSON Array literal from the 'Array' builder.
 {-# INLINE array #-}
 array :: Array -> JSON
 array (Array x) =
-  JSON (maybe E.emptyArray (inline E.inCurlies) x)
+  JSON (maybe E.emptyArray (inline E.inSquarelies) x)
 
+-- |
+-- Object builder from a key-value pair,
+-- where value is an already encoded JSON literal.
+-- 
+-- Use the 'Object' 'Monoid' instance
+-- to construct multi-row objects.
 {-# INLINE row #-}
 row :: Text -> JSON -> Object
 row key (JSON value) =
   Object (Just (inline E.row key value))
 
+-- |
+-- Array builder from an element,
+-- which is an already encoded JSON literal.
+-- 
+-- Use the 'Array' 'Monoid' instance
+-- to construct multi-element arrays.
 {-# INLINE element #-}
 element :: JSON -> Array
 element (JSON value) =
diff --git a/library/JSONBytesBuilder/Builders.hs b/library/JSONBytesBuilder/Builders.hs
deleted file mode 100644
--- a/library/JSONBytesBuilder/Builders.hs
+++ /dev/null
@@ -1,66 +0,0 @@
-module JSONBytesBuilder.Builders
-where
-
-import JSONBytesBuilder.Prelude hiding (length, null)
-import Data.ByteString.Builder
-import qualified JSONBytesBuilder.BoundedPrims as A
-import qualified Data.ByteString.Builder.Prim as A
-import qualified Data.Text.Encoding as B
-import qualified Data.Scientific as C
-import qualified Data.ByteString.Builder.Scientific as D
-
-
-{-# INLINABLE null #-}
-null :: Builder
-null =
-  A.primBounded A.null ()
-
-{-# INLINABLE boolean #-}
-boolean :: Bool -> Builder
-boolean =
-  A.primBounded A.boolean
-
-{-# INLINABLE string #-}
-string :: Text -> Builder
-string x =
-  char8 '"' <> B.encodeUtf8BuilderEscaped A.stringEncodedByte x <> char8 '"'
-
-{-# INLINABLE scientific #-}
-scientific :: Scientific -> Builder
-scientific n =
-  if e < 0
-    then D.scientificBuilder n
-    else integerDec (C.coefficient n * 10 ^ e)
-  where
-    e =
-      C.base10Exponent n
-
-{-# INLINABLE inCurlies #-}
-inCurlies :: Builder -> Builder
-inCurlies x =
-  char8 '{' <> x <> char8 '}'
-
-{-# INLINABLE row #-}
-row :: Text -> Builder -> Builder
-row key value =
-  string key <> char8 ':' <> value
-
-{-# INLINABLE inSquarlies #-}
-inSquarlies :: Builder -> Builder
-inSquarlies x =
-  char8 '[' <> x <> char8 ']'
-
-{-# INLINABLE commaSeparated #-}
-commaSeparated :: Builder -> Builder -> Builder
-commaSeparated left right =
-  left <> char8 ',' <> right
-
-{-# INLINABLE emptyObject #-}
-emptyObject :: Builder
-emptyObject =
-  A.primBounded A.emptyObject ()
-
-{-# INLINABLE emptyArray #-}
-emptyArray :: Builder
-emptyArray =
-  A.primBounded A.emptyArray ()
diff --git a/library/JSONBytesBuilder/ByteString/BoundedPrims.hs b/library/JSONBytesBuilder/ByteString/BoundedPrims.hs
new file mode 100644
--- /dev/null
+++ b/library/JSONBytesBuilder/ByteString/BoundedPrims.hs
@@ -0,0 +1,72 @@
+module JSONBytesBuilder.ByteString.BoundedPrims
+where
+
+import JSONBytesBuilder.Prelude
+import Data.ByteString.Builder.Prim
+
+
+{-# INLINE null #-}
+null :: BoundedPrim ()
+null =
+  ascii4 ('n', ('u', ('l', 'l')))
+
+{-# INLINE boolean #-}
+boolean :: BoundedPrim Bool
+boolean =
+  condB id (ascii4 ('t', ('r', ('u', 'e')))) (ascii5 ('f', ('a', ('l', ('s', 'e')))))
+
+{-# INLINE emptyArray #-}
+emptyArray :: BoundedPrim ()
+emptyArray =
+  ascii2 ('[', ']')
+
+{-# INLINE emptyObject #-}
+emptyObject :: BoundedPrim ()
+emptyObject =
+  ascii2 ('{', '}')
+
+{-# INLINE stringEncodedByte #-}
+stringEncodedByte :: BoundedPrim Word8
+stringEncodedByte =
+  condB (== (fromIntegral . ord) '\\') (ascii2 ('\\', '\\')) $
+  condB (== (fromIntegral . ord) '\"') (ascii2 ('\\', '"')) $
+  condB (>= (fromIntegral . ord) '\x20') (liftFixedToBounded word8) $
+  condB (== (fromIntegral . ord) '\n') (ascii2 ('\\', 'n')) $
+  condB (== (fromIntegral . ord) '\r') (ascii2 ('\\', 'r')) $
+  condB (== (fromIntegral . ord) '\t') (ascii2 ('\\', 't')) $
+  hexEncodedByte
+
+{-# INLINE hexEncodedByte #-}
+hexEncodedByte :: BoundedPrim Word8
+hexEncodedByte =
+  liftFixedToBounded ((\c -> ('\\', ('u', fromIntegral c))) >$< char8 >*< char8 >*< word16HexFixed)
+
+{-# INLINE ascii2 #-}
+ascii2 :: (Char, Char) -> BoundedPrim a
+ascii2 cs =
+  liftFixedToBounded $
+  const cs >$< char8 >*< char8
+
+{-# INLINE ascii4 #-}
+ascii4 :: (Char, (Char, (Char, Char))) -> BoundedPrim a
+ascii4 cs =
+  liftFixedToBounded $
+  const cs >$< char8 >*< char8 >*< char8 >*< char8
+
+{-# INLINE ascii5 #-}
+ascii5 :: (Char, (Char, (Char, (Char, Char)))) -> BoundedPrim a
+ascii5 cs =
+  liftFixedToBounded $
+  const cs >$< char8 >*< char8 >*< char8 >*< char8 >*< char8
+
+{-# INLINE ascii6 #-}
+ascii6 :: (Char, (Char, (Char, (Char, (Char, Char))))) -> BoundedPrim a
+ascii6 cs =
+  liftFixedToBounded $ 
+  const cs >$< char8 >*< char8 >*< char8 >*< char8 >*< char8 >*< char8
+
+{-# INLINE ascii8 #-}
+ascii8 :: (Char, (Char, (Char, (Char, (Char, (Char, (Char, Char))))))) -> BoundedPrim a
+ascii8 cs =
+  liftFixedToBounded $
+  const cs >$< char8 >*< char8 >*< char8 >*< char8 >*< char8 >*< char8 >*< char8 >*< char8
diff --git a/library/JSONBytesBuilder/ByteString/Builders.hs b/library/JSONBytesBuilder/ByteString/Builders.hs
new file mode 100644
--- /dev/null
+++ b/library/JSONBytesBuilder/ByteString/Builders.hs
@@ -0,0 +1,66 @@
+module JSONBytesBuilder.ByteString.Builders
+where
+
+import JSONBytesBuilder.Prelude hiding (length, null)
+import Data.ByteString.Builder
+import qualified JSONBytesBuilder.ByteString.BoundedPrims as A
+import qualified Data.ByteString.Builder.Prim as A
+import qualified Data.Text.Encoding as B
+import qualified Data.Scientific as C
+import qualified Data.ByteString.Builder.Scientific as D
+
+
+{-# INLINABLE null #-}
+null :: Builder
+null =
+  A.primBounded A.null ()
+
+{-# INLINABLE boolean #-}
+boolean :: Bool -> Builder
+boolean =
+  A.primBounded A.boolean
+
+{-# INLINABLE string #-}
+string :: Text -> Builder
+string x =
+  char8 '"' <> B.encodeUtf8BuilderEscaped A.stringEncodedByte x <> char8 '"'
+
+{-# INLINABLE scientific #-}
+scientific :: Scientific -> Builder
+scientific n =
+  if e < 0
+    then D.scientificBuilder n
+    else integerDec (C.coefficient n * 10 ^ e)
+  where
+    e =
+      C.base10Exponent n
+
+{-# INLINABLE inCurlies #-}
+inCurlies :: Builder -> Builder
+inCurlies x =
+  char8 '{' <> x <> char8 '}'
+
+{-# INLINABLE row #-}
+row :: Text -> Builder -> Builder
+row key value =
+  string key <> char8 ':' <> value
+
+{-# INLINABLE inSquarelies #-}
+inSquarelies :: Builder -> Builder
+inSquarelies x =
+  char8 '[' <> x <> char8 ']'
+
+{-# INLINABLE commaSeparated #-}
+commaSeparated :: Builder -> Builder -> Builder
+commaSeparated left right =
+  left <> char8 ',' <> right
+
+{-# INLINABLE emptyObject #-}
+emptyObject :: Builder
+emptyObject =
+  A.primBounded A.emptyObject ()
+
+{-# INLINABLE emptyArray #-}
+emptyArray :: Builder
+emptyArray =
+  A.primBounded A.emptyArray ()
