diff --git a/CHANGELOG.md b/CHANGELOG.md
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -1,5 +1,10 @@
 # Change Log
 
+## 0.19.0
+
+* Fix `Equals` function requiring `Val Bool` arguments instead of `Val a`
+* Add `Metadata` field to `Resource` type
+
 ## 0.18.0
 
 * Update resource specification document to version 2.0.0
diff --git a/examples/ec2-with-eip.hs b/examples/ec2-with-eip.hs
--- a/examples/ec2-with-eip.hs
+++ b/examples/ec2-with-eip.hs
@@ -1,5 +1,6 @@
 {-# LANGUAGE OverloadedLists #-}
 {-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE QuasiQuotes #-}
 
 -- | This is a translated version of an example from the CloudFormation docs at
 -- https://s3.amazonaws.com/cloudformation-templates-us-east-1/EIP_With_Association.template.
@@ -9,6 +10,8 @@
 module Main where
 
 import Control.Lens
+import Data.Aeson
+import Data.Aeson.QQ (aesonQQ)
 import qualified Data.ByteString.Lazy.Char8 as B
 
 import Stratosphere
@@ -29,6 +32,7 @@
       & eciSecurityGroups ?~ [Ref "InstanceSecuritygroup"]
       )
     & resourceDeletionPolicy ?~ Retain
+    & resourceMetadata ?~ ec2Metadata
   , resource "InstanceSecurityGroup" $
     EC2SecurityGroupProperties $
     ec2SecurityGroup
@@ -62,6 +66,37 @@
     (Ref "IPAddress")
     & outputDescription ?~ "IP address of the newly created EC2 instance"
   ]
+
+ec2Metadata :: Object
+(Object ec2Metadata) = [aesonQQ|
+{
+  "AWS::CloudFormation::Init": {
+    "configSets": {
+      "test1": ["1"],
+      "test2": [{"ConfigSet": "test1"}, "2"],
+      "default": [{"ConfigSet": "test2"}]
+    },
+    "1": {
+      "commands": {
+        "test": {
+          "command": "echo \"$MAGIC\" > test.txt",
+          "env": {"MAGIC": "I come from the environment!"},
+          "cwd": "~"
+        }
+      }
+    },
+    "2": {
+      "commands": {
+        "test": {
+          "command": "echo \"$MAGIC\" >> test.txt",
+          "env": {"MAGIC": "I am test 2!"},
+          "cwd": "~"
+        }
+      }
+    }
+  }
+}
+|]
 
 instanceTypeParam :: Parameter
 instanceTypeParam =
diff --git a/library-gen/Stratosphere/Resources.hs b/library-gen/Stratosphere/Resources.hs
--- a/library-gen/Stratosphere/Resources.hs
+++ b/library-gen/Stratosphere/Resources.hs
@@ -32,6 +32,7 @@
   , resourceCreationPolicy
   , resourceUpdatePolicy
   , resourceDependsOn
+  , resourceMetadata
   , ResourceProperties (..)
   , DeletionPolicy (..)
   , Resources (..)
@@ -1102,6 +1103,7 @@
   , _resourceCreationPolicy :: Maybe CreationPolicy
   , _resourceUpdatePolicy :: Maybe UpdatePolicy
   , _resourceDependsOn :: Maybe [T.Text]
+  , _resourceMetadata :: Maybe Object
   } deriving (Show, Eq)
 
 instance ToRef Resource b where
@@ -1120,17 +1122,19 @@
   , _resourceCreationPolicy = Nothing
   , _resourceUpdatePolicy = Nothing
   , _resourceDependsOn = Nothing
+  , _resourceMetadata = Nothing
   }
 
 $(makeLenses ''Resource)
 
 resourceToJSON :: Resource -> Value
-resourceToJSON (Resource _ props dp cp up deps) =
+resourceToJSON (Resource _ props dp cp up deps meta) =
     object $ resourcePropertiesJSON props ++ catMaybes
     [ maybeField "DeletionPolicy" dp
     , maybeField "CreationPolicy" cp
     , maybeField "UpdatePolicy" up
     , maybeField "DependsOn" deps
+    , maybeField "Metadata" meta
     ]
 
 resourcePropertiesJSON :: ResourceProperties -> [Pair]
@@ -1917,7 +1921,8 @@
        cp <- o .:? "CreationPolicy"
        up <- o .:? "UpdatePolicy"
        deps <- o .:? "DependsOn"
-       return $ Resource n props dp cp up deps
+       meta <- o .:? "Metadata"
+       return $ Resource n props dp cp up deps meta
 
 -- | Wrapper around a list of 'Resources's to we can modify the aeson
 -- instances.
diff --git a/library/Stratosphere/Values.hs b/library/Stratosphere/Values.hs
--- a/library/Stratosphere/Values.hs
+++ b/library/Stratosphere/Values.hs
@@ -41,7 +41,7 @@
  | Ref Text
  | If Text (Val a) (Val a)
  | And (Val Bool) (Val Bool)
- | Equals (Val Bool) (Val Bool)
+ | Equals (Val a) (Val a)
  | Or (Val Bool) (Val Bool)
  | GetAtt Text Text
  | Base64 (Val Text)
@@ -63,7 +63,7 @@
   toJSON (Ref r) = refToJSON r
   toJSON (If i x y) = mkFunc "Fn::If" [toJSON i, toJSON x, toJSON y]
   toJSON (And x y) = mkFunc "Fn::And" [toJSON (Bool' <$> x), toJSON (Bool' <$> y)]
-  toJSON (Equals x y) = mkFunc "Fn::Equals" [toJSON (Bool' <$> x), toJSON (Bool' <$> y)]
+  toJSON (Equals x y) = mkFunc "Fn::Equals" [toJSON x, toJSON y]
   toJSON (Or x y) = mkFunc "Fn::Or" [toJSON (Bool' <$> x), toJSON (Bool' <$> y)]
   toJSON (GetAtt x y) = mkFunc "Fn::GetAtt" [toJSON x, toJSON y]
   toJSON (Base64 v) = object [("Fn::Base64", toJSON v)]
@@ -95,7 +95,7 @@
       [("Ref", o')] -> Ref <$> parseJSON o'
       [("Fn::If", o')] -> (\(i, x, y) -> If i x y) <$> parseJSON o'
       [("Fn::And", o')] -> (\(x, y) -> And (unBool' <$> x) (unBool' <$> y)) <$> parseJSON o'
-      [("Fn::Equals", o')] -> (\(x, y) -> Equals (unBool' <$> x) (unBool' <$> y)) <$> parseJSON o'
+      [("Fn::Equals", o')] -> uncurry Equals <$> parseJSON o'
       [("Fn::Or", o')] -> (\(x, y) -> Or (unBool' <$> x) (unBool' <$> y)) <$> parseJSON o'
       [("Fn::GetAtt", o')] -> uncurry GetAtt <$> parseJSON o'
       [("Fn::Base64", o')] -> Base64 <$> parseJSON o'
diff --git a/stratosphere.cabal b/stratosphere.cabal
--- a/stratosphere.cabal
+++ b/stratosphere.cabal
@@ -2,10 +2,10 @@
 --
 -- see: https://github.com/sol/hpack
 --
--- hash: 114b5d0163580877c3ed207ba283b8d1fe2e14c76ff53f37a76ae031c6862eaa
+-- hash: 6ea38dbad049185fb83defe79936d44b9b198398650dea1e93e02df23c5dc45f
 
 name:           stratosphere
-version:        0.18.0
+version:        0.19.0
 synopsis:       EDSL for AWS CloudFormation
 description:    EDSL for AWS CloudFormation
 category:       AWS, Cloud
@@ -891,6 +891,7 @@
   build-depends:
       aeson >=0.11
     , aeson-pretty >=0.8
+    , aeson-qq
     , base >=4.8 && <5
     , bytestring
     , containers
