diff --git a/http-dispatch.cabal b/http-dispatch.cabal
--- a/http-dispatch.cabal
+++ b/http-dispatch.cabal
@@ -1,5 +1,5 @@
 name:                http-dispatch
-version:             0.3.0.0
+version:             0.4.0.0
 synopsis:            High level HTTP client for Haskell
 description:         Please see README.md
 homepage:            http://github.com/owainlewis/http-dispatch#readme
@@ -17,12 +17,12 @@
   exposed-modules:     Network.HTTP.Dispatch.Core
                      , Network.HTTP.Dispatch.Types
                      , Network.HTTP.Dispatch.Request
+                     , Network.HTTP.Dispatch.Extra
   build-depends:       base >= 4.7 && < 5
                      , http-client
                      , http-client-tls
                      , http-types
                      , bytestring
-                     , aeson
                      , case-insensitive
   default-language:    Haskell2010
 
@@ -33,6 +33,7 @@
   build-depends:       base
                      , http-dispatch
                      , hspec
+                     , aeson
   ghc-options:         -threaded -rtsopts -with-rtsopts=-N
   default-language:    Haskell2010
 
diff --git a/src/Network/HTTP/Dispatch/Core.hs b/src/Network/HTTP/Dispatch/Core.hs
--- a/src/Network/HTTP/Dispatch/Core.hs
+++ b/src/Network/HTTP/Dispatch/Core.hs
@@ -5,48 +5,55 @@
        , HTTPRequestMethod(..)
        , runRequest
        , get
+       , getWithHeaders
        , post
+       , postWithHeaders
+       , put
+       , putWithHeaders
        , patch
+       , patchWithHeaders
        , delete
-       , put
-       , simpleGet
-       , postString
-       , postAeson
+       , deleteWithHeaders
        ) where
 
-import qualified Data.Aeson                    as Aeson (ToJSON, encode)
 import qualified Data.ByteString.Lazy          as LBS
-import qualified Data.ByteString.Lazy.Char8    as LBSC
 import           Network.HTTP.Dispatch.Request
 import           Network.HTTP.Dispatch.Types
 
+-----------------------------------------------------------------------------------
+-- Request API
+-----------------------------------------------------------------------------------
+
 type Url = String
+type Headers = [Header]
+type Body = LBS.ByteString
 
--- Request API
+get :: Url -> HTTPRequest
+get url = HTTPRequest GET url [] Nothing
 
-get :: Url -> [Header] -> HTTPRequest
-get url headers = HTTPRequest GET url headers Nothing
+getWithHeaders :: String -> [Header] -> HTTPRequest
+getWithHeaders url headers = HTTPRequest GET url headers Nothing
 
-simpleGet :: Url -> HTTPRequest
-simpleGet url = HTTPRequest GET url [] Nothing
+post :: Url -> Body -> HTTPRequest
+post url body = postWithHeaders url [] body
 
--- Post request with a lazy bytestring payload
-post :: Url -> [Header] -> LBS.ByteString -> HTTPRequest
-post url headers body = HTTPRequest POST url headers (pure body)
+postWithHeaders :: Url -> Headers -> Body -> HTTPRequest
+postWithHeaders url headers body = HTTPRequest POST url headers (Just body)
 
--- Post request with a string payload
-postString :: String -> [Header] -> String -> HTTPRequest
-postString url headers body = HTTPRequest POST url headers (pure . LBSC.pack $ body)
+put :: Url -> Body -> HTTPRequest
+put url body = putWithHeaders url [] body
 
--- Post request where the payload is some type that has a ToJSON instance defined
-postAeson :: Aeson.ToJSON a => Url -> [Header] -> a -> HTTPRequest
-postAeson url headers body = HTTPRequest POST url headers (pure $ Aeson.encode body)
+putWithHeaders :: Url -> Headers -> Body -> HTTPRequest
+putWithHeaders url headers body = HTTPRequest PUT url headers (Just body)
 
-put :: String -> [Header] -> LBS.ByteString -> HTTPRequest
-put url headers body = HTTPRequest PUT url headers (pure body)
+patch :: Url -> Body -> HTTPRequest
+patch url body = patchWithHeaders url [] body
 
-delete :: String -> [Header] -> Maybe LBS.ByteString -> HTTPRequest
-delete url headers = HTTPRequest DELETE url headers
+patchWithHeaders :: Url -> Headers -> Body -> HTTPRequest
+patchWithHeaders url headers body = HTTPRequest PATCH url headers (Just body)
 
-patch :: String -> [Header] -> LBS.ByteString -> HTTPRequest
-patch url headers body = HTTPRequest PATCH url headers (pure body)
+delete :: Url -> HTTPRequest
+delete url = deleteWithHeaders url []
+
+deleteWithHeaders :: Url -> Headers -> HTTPRequest
+deleteWithHeaders url headers = HTTPRequest DELETE url headers Nothing
diff --git a/src/Network/HTTP/Dispatch/Extra.hs b/src/Network/HTTP/Dispatch/Extra.hs
new file mode 100644
--- /dev/null
+++ b/src/Network/HTTP/Dispatch/Extra.hs
@@ -0,0 +1,18 @@
+{-# LANGUAGE FlexibleInstances #-}
+module Network.HTTP.Dispatch.Extra
+       ( fromString
+       ) where
+
+import qualified Data.ByteString.Lazy       as LBS
+import qualified Data.ByteString.Lazy.Char8 as LBSC
+
+-----------------------------------------------------------------------------------
+-- Extra methods for friendly API (experimental)
+-----------------------------------------------------------------------------------
+
+-- Can be used to generate a HTTP request without needing to prepare Lazy ByteStrings.
+--
+-- Example:
+--   HTTPRequest POST "http://api.mysite.com" [("Content-Type", "application/json")] (fromString "HELLO WORLD")
+fromString :: String -> LBS.ByteString
+fromString = LBSC.pack
diff --git a/src/Network/HTTP/Dispatch/Request.hs b/src/Network/HTTP/Dispatch/Request.hs
--- a/src/Network/HTTP/Dispatch/Request.hs
+++ b/src/Network/HTTP/Dispatch/Request.hs
@@ -32,8 +32,10 @@
               , checkStatus = \_ _ _ -> Nothing
               }
     case body of
-      Just lbs -> return $ req { requestBody = RequestBodyLBS lbs }
-      Nothing -> return $ req
+      Just lbs -> 
+        return $ req { requestBody = RequestBodyLBS lbs }
+      Nothing -> 
+        return req
 
 getManagerForUrl :: String -> IO Manager
 getManagerForUrl url =
diff --git a/src/Network/HTTP/Dispatch/Types.hs b/src/Network/HTTP/Dispatch/Types.hs
--- a/src/Network/HTTP/Dispatch/Types.hs
+++ b/src/Network/HTTP/Dispatch/Types.hs
@@ -1,6 +1,9 @@
+{-# LANGUAGE FlexibleInstances    #-}
+{-# LANGUAGE TypeSynonymInstances #-}
 module Network.HTTP.Dispatch.Types where
 
-import qualified Data.ByteString.Lazy as LBS
+import qualified Data.ByteString.Lazy       as LBS
+import qualified Data.ByteString.Lazy.Char8 as LBSC
 
 data HTTPRequestMethod =
     GET
@@ -10,6 +13,12 @@
   | DELETE deriving ( Eq, Show )
 
 type Header = (String, String)
+
+class Packable a where
+    pack :: a -> LBS.ByteString
+
+instance Packable String where
+    pack = LBSC.pack
 
 data HTTPRequest = HTTPRequest {
    -- A HTTP request method e.g GET POST etc
