diff --git a/mandrill.cabal b/mandrill.cabal
--- a/mandrill.cabal
+++ b/mandrill.cabal
@@ -1,5 +1,5 @@
 name:                mandrill
-version:             0.4.1.0
+version:             0.5.0.0
 synopsis:            Library for interfacing with the Mandrill JSON API
 description:         Pure Haskell client for the Mandrill JSON API
 license:             MIT
@@ -46,6 +46,7 @@
     , time
     , email-validate >= 1.0.0
     , old-locale
+    , unordered-containers
   hs-source-dirs:
     src
   default-language:
diff --git a/src/Network/API/Mandrill.hs b/src/Network/API/Mandrill.hs
--- a/src/Network/API/Mandrill.hs
+++ b/src/Network/API/Mandrill.hs
@@ -32,6 +32,7 @@
 import Text.Email.Validate
 import qualified Data.Text as T
 import qualified Data.Aeson as JSON
+import qualified Data.HashMap.Strict as H
 
 {- $exampleusage
 
@@ -40,7 +41,7 @@
 > {-# LANGUAGE OverloadedStrings #-}
 > import Text.Email.Validate
 > import Network.API.Mandrill
-> 
+>
 > main :: IO ()
 > main = do
 >   case validate "foo@example.com" of
@@ -66,7 +67,7 @@
  , _mmsg_from_email = (MandrillEmail f)
  , _mmsg_from_name = Nothing
  , _mmsg_to = map newRecipient t
- , _mmsg_headers = JSON.Null
+ , _mmsg_headers = H.empty
  , _mmsg_important = Nothing
  , _mmsg_track_opens = Nothing
  , _mmsg_track_clicks = Nothing
@@ -87,7 +88,7 @@
  , _mmsg_subaccount = Nothing
  , _mmsg_google_analytics_domains = []
  , _mmsg_google_analytics_campaign = Nothing
- , _mmsg_metadata = JSON.Null
+ , _mmsg_metadata = H.empty
  , _mmsg_recipient_metadata = []
  , _mmsg_attachments = []
  , _mmsg_images = []
diff --git a/src/Network/API/Mandrill/Types.hs b/src/Network/API/Mandrill/Types.hs
--- a/src/Network/API/Mandrill/Types.hs
+++ b/src/Network/API/Mandrill/Types.hs
@@ -19,6 +19,7 @@
 #endif
 import qualified Data.ByteString as B
 import qualified Data.ByteString.Base64 as Base64
+import qualified Data.HashMap.Strict as H
 import qualified Data.Text as T
 import qualified Data.Text.Encoding as TL
 import qualified Data.Text.Lazy as TL
@@ -170,17 +171,23 @@
 
 
 --------------------------------------------------------------------------------
-type MandrillHeaders = Value
+type MandrillHeaders = Object
 
 
 --------------------------------------------------------------------------------
-type MandrillVars = Value
 
+data MergeVar = MergeVar {
+      _mv_name    :: !T.Text
+    , _mv_content :: Value
+    } deriving Show
 
+makeLenses ''MergeVar
+deriveJSON defaultOptions { fieldLabelModifier = drop 4 } ''MergeVar
+
 --------------------------------------------------------------------------------
 data MandrillMergeVars = MandrillMergeVars {
     _mmvr_rcpt :: !T.Text
-  , _mmvr_vars :: [MandrillVars]
+  , _mmvr_vars :: [MergeVar]
   } deriving Show
 
 makeLenses ''MandrillMergeVars
@@ -189,7 +196,7 @@
 --------------------------------------------------------------------------------
 data MandrillMetadata = MandrillMetadata {
     _mmdt_rcpt :: !T.Text
-  , _mmdt_values :: MandrillVars
+  , _mmdt_values :: Object
   } deriving Show
 
 makeLenses ''MandrillMetadata
@@ -266,7 +273,7 @@
  , _mmsg_tracking_domain :: Maybe T.Text
    -- ^ a custom domain to use for tracking opens and clicks instead of mandrillapp.com
  , _mmsg_signing_domain :: Maybe Bool
-   -- ^ a custom domain to use for SPF/DKIM signing instead of mandrill 
+   -- ^ a custom domain to use for SPF/DKIM signing instead of mandrill
    -- (for "via" or "on behalf of" in email clients)
  , _mmsg_return_path_domain :: Maybe Bool
    -- ^ a custom domain to use for the messages's return-path
@@ -274,7 +281,7 @@
    -- ^ whether to evaluate merge tags in the message.
    -- Will automatically be set to true if either merge_vars
    -- or global_merge_vars are provided.
- , _mmsg_global_merge_vars :: [MandrillVars]
+ , _mmsg_global_merge_vars :: [MergeVar]
    -- ^ global merge variables to use for all recipients. You can override these per recipient.
  , _mmsg_merge_vars :: [MandrillMergeVars]
    -- ^ per-recipient merge variables, which override global merge variables with the same name.
@@ -295,7 +302,7 @@
    -- ^ optional string indicating the value to set for the utm_campaign
    -- tracking parameter. If this isn't provided the email's from address
    -- will be used instead.
- , _mmsg_metadata :: MandrillVars
+ , _mmsg_metadata :: Object
    -- ^ metadata an associative array of user metadata. Mandrill will store
    -- this metadata and make it available for retrieval.
    -- In addition, you can select up to 10 metadata fields to index
@@ -319,7 +326,7 @@
                               <*> pure (MandrillEmail . fromJust $ emailAddress "sender@example.com")
                               <*> pure Nothing
                               <*> resize 2 arbitrary
-                              <*> pure emptyObject
+                              <*> pure H.empty
                               <*> pure Nothing
                               <*> pure Nothing
                               <*> pure Nothing
@@ -340,7 +347,7 @@
                               <*> pure Nothing
                               <*> pure []
                               <*> pure Nothing
-                              <*> pure emptyObject
+                              <*> pure H.empty
                               <*> pure []
                               <*> pure []
                               <*> pure []
