diff --git a/serverless-haskell.cabal b/serverless-haskell.cabal
--- a/serverless-haskell.cabal
+++ b/serverless-haskell.cabal
@@ -2,10 +2,10 @@
 --
 -- see: https://github.com/sol/hpack
 --
--- hash: ce5c80cf11a767160659f257fa8a624d46249ad9777655b9054afe79c3875bcb
+-- hash: 646a2ccc127e873e3a4a1e9fe20394f9e59efa372a3557893a9c476069b0f1ba
 
 name:           serverless-haskell
-version:        0.3.1
+version:        0.4.0
 synopsis:       Deploying Haskell code onto AWS Lambda using Serverless
 description:    Utilities to help process the events from AWS Lambda when deployed with the serverless-haskell plugin.
 category:       AWS, Cloud, Network
@@ -44,7 +44,6 @@
   exposed-modules:
       AWSLambda
       AWSLambda.Events
-      AWSLambda.Events.Embedded
       AWSLambda.Events.KinesisEvent
       AWSLambda.Events.Records
       AWSLambda.Events.S3Event
@@ -52,6 +51,7 @@
       AWSLambda.Handler
       AWSLambda.Orphans
       Data.Aeson.Alternative
+      Data.Aeson.Embedded
   other-modules:
       Paths_serverless_haskell
   default-language: Haskell2010
@@ -83,5 +83,7 @@
       AWSLambda.Events.S3EventSpec
       AWSLambda.Events.SNSEventSpec
       Data.Aeson.AlternativeSpec
+      Data.Aeson.EmbeddedSpec
+      Data.Aeson.TestUtil
       Paths_serverless_haskell
   default-language: Haskell2010
diff --git a/src/AWSLambda.hs b/src/AWSLambda.hs
--- a/src/AWSLambda.hs
+++ b/src/AWSLambda.hs
@@ -74,6 +74,12 @@
   >   haskell:
   >     extraLibraries:
   >       - libpcre.so.3
+
+* To force using Stack's Docker image, set @docker@ key to @true@.
+
+  > custom:
+  >   haskell:
+  >     docker: true
 -}
 module AWSLambda
   ( Handler.lambdaMain
diff --git a/src/AWSLambda/Events/Embedded.hs b/src/AWSLambda/Events/Embedded.hs
deleted file mode 100644
--- a/src/AWSLambda/Events/Embedded.hs
+++ /dev/null
@@ -1,24 +0,0 @@
-{-# LANGUAGE OverloadedStrings #-}
-{-# LANGUAGE RecordWildCards   #-}
-{-# LANGUAGE TemplateHaskell   #-}
-
-{-|
-Module: AWSLambda.Events.Embedded
-Description: Type for a JSON value embedded within a JSON string value
--}
-module AWSLambda.Events.Embedded where
-
-import           Control.Lens.TH
-import           Data.Aeson
-import Data.Text.Encoding        (encodeUtf8)
-
--- | Type for a JSON value embedded within a JSON string value
-newtype Embedded a = Embedded { _unEmbed :: a } deriving (Eq, Show)
-
-instance FromJSON a =>
-         FromJSON (Embedded a) where
-  parseJSON =
-    withText "Embedded JSON" $
-    fmap Embedded . either fail pure . eitherDecodeStrict . encodeUtf8
-
-$(makeLenses ''Embedded)
diff --git a/src/Data/Aeson/Embedded.hs b/src/Data/Aeson/Embedded.hs
new file mode 100644
--- /dev/null
+++ b/src/Data/Aeson/Embedded.hs
@@ -0,0 +1,31 @@
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE RecordWildCards   #-}
+{-# LANGUAGE TemplateHaskell   #-}
+
+{-|
+Module: Data.Aeson.Embedded
+Description: Type for a JSON value embedded within a JSON string value
+-}
+module Data.Aeson.Embedded where
+
+import           Control.Lens.TH
+import           Data.Aeson
+import           Data.Text.Lazy            (Text)
+import           Data.Text.Lazy.Encoding   (decodeUtf8, encodeUtf8)
+
+-- | Type for a JSON value embedded within a JSON string value
+newtype Embedded a = Embedded { _unEmbed :: a } deriving (Eq, Show)
+
+instance FromJSON a =>
+         FromJSON (Embedded a) where
+  parseJSON v =
+    fmap Embedded . either fail pure . eitherDecode . encodeUtf8 =<< parseJSON v
+
+instance ToJSON a => ToJSON (Embedded a) where
+  toJSON = toJSON . embed
+  toEncoding = toEncoding . embed
+
+embed :: ToJSON a => Embedded a -> Text
+embed = decodeUtf8 . encode . _unEmbed
+
+$(makeLenses ''Embedded)
diff --git a/test/AWSLambda/Events/SNSEventSpec.hs b/test/AWSLambda/Events/SNSEventSpec.hs
--- a/test/AWSLambda/Events/SNSEventSpec.hs
+++ b/test/AWSLambda/Events/SNSEventSpec.hs
@@ -3,12 +3,12 @@
 
 module AWSLambda.Events.SNSEventSpec where
 
-import           AWSLambda.Events.Embedded
 import           AWSLambda.Events.Records
 import           AWSLambda.Events.S3Event
 import           AWSLambda.Events.SNSEvent
 
 import           Data.Aeson
+import           Data.Aeson.Embedded
 import           Data.ByteString.Lazy      (ByteString)
 import qualified Data.HashMap.Strict       as HashMap
 import           Data.Text                 (Text)
diff --git a/test/Data/Aeson/EmbeddedSpec.hs b/test/Data/Aeson/EmbeddedSpec.hs
new file mode 100644
--- /dev/null
+++ b/test/Data/Aeson/EmbeddedSpec.hs
@@ -0,0 +1,15 @@
+{-# LANGUAGE OverloadedStrings #-}
+module Data.Aeson.EmbeddedSpec where
+
+import Data.Aeson
+import Data.Aeson.Embedded
+import Data.Aeson.TestUtil
+
+import Test.Hspec
+
+spec :: Spec
+spec = describe "Embedded" $ do
+  testEncodeDecode "array" "\"[1,2,3]\"" $ Embedded [1::Int, 2, 3]
+  testEncodeDecode "string" "\"\\\"foo\\\"\"" $ Embedded ("foo"::String)
+  testEncodeDecode "object" "\"{\\\"a\\\":42,\\\"b\\\":true}\"" $ Embedded $ object ["a" .= (42::Int), "b" .= True]
+  testEncodeDecode "in field" "{\"a\":\"[1,2,3]\"}" $ object ["a" .= Embedded [1::Int, 2, 3]]
diff --git a/test/Data/Aeson/TestUtil.hs b/test/Data/Aeson/TestUtil.hs
new file mode 100644
--- /dev/null
+++ b/test/Data/Aeson/TestUtil.hs
@@ -0,0 +1,13 @@
+module Data.Aeson.TestUtil where
+
+import Data.Aeson
+import Data.ByteString.Lazy (ByteString)
+
+import Test.Hspec
+
+testEncodeDecode :: (FromJSON a, ToJSON a, Show a, Eq a) => String -> ByteString -> a -> Spec
+testEncodeDecode description bytestring value = describe description $ do
+        it "decodes" $
+          decode bytestring `shouldBe` Just value
+        it "encodes" $
+          encode value `shouldBe` bytestring
