diff --git a/changelog.md b/changelog.md
--- a/changelog.md
+++ b/changelog.md
@@ -1,5 +1,11 @@
 # Changelog
 
+## 0.6.0.0
+
+- Support `JsonDict` from `json-spec` 1.4, generating Elm `Dict`
+  encoders and decoders.
+- Require `json-spec` >= 1.4.0.0.
+
 ## 0.5.0.3
 
 - Refresh dependency freeze and allow `containers` 0.8.
diff --git a/json-spec-elm.cabal b/json-spec-elm.cabal
--- a/json-spec-elm.cabal
+++ b/json-spec-elm.cabal
@@ -1,6 +1,6 @@
 cabal-version:       3.0
 name:                json-spec-elm
-version:             0.5.0.3
+version:             0.6.0.0
 synopsis:            Elm code generate for `json-spec`.
 description:         
                      Produce elm types, encoders, and decoders from a
@@ -25,7 +25,7 @@
     , base                 >= 4.19.2.0 && < 4.23
     , containers           >= 0.6.8    && < 0.9
     , elm-syntax           >= 0.3.3.0  && < 0.4
-    , json-spec            >= 1.3.0.0  && < 1.4
+    , json-spec            >= 1.4.0.0  && < 1.5
     , text                 >= 2.1.1    && < 2.2
 
 common warnings
diff --git a/src/Data/JsonSpec/Elm.hs b/src/Data/JsonSpec/Elm.hs
--- a/src/Data/JsonSpec/Elm.hs
+++ b/src/Data/JsonSpec/Elm.hs
@@ -101,28 +101,34 @@
   Named,
 ) where
 
-
 import Bound (Scope(Scope), Var(B), abstract1, closed, toScope)
-import Control.Monad.Writer (MonadTrans(lift), MonadWriter(tell),
-  Writer, execWriter)
-import Data.JsonSpec (FieldSpec(Optional, Required),
-  Specification(JsonArray, JsonBool, JsonDateTime, JsonEither, JsonInt,
-  JsonLet, JsonNullable, JsonNum, JsonObject, JsonRef, JsonString,
-  JsonTag))
+import Control.Monad.Writer
+  ( MonadTrans(lift), MonadWriter(tell), Writer, execWriter
+  )
+import Data.JsonSpec
+  ( FieldSpec(Optional, Required)
+  , Specification
+    ( JsonArray, JsonBool, JsonDateTime, JsonDict, JsonEither, JsonInt, JsonLet
+    , JsonNullable, JsonNum, JsonObject, JsonRef, JsonString, JsonTag
+    )
+  )
 import Data.Proxy (Proxy(Proxy))
 import Data.Set (Set)
 import Data.String (IsString(fromString))
 import Data.Text (Text)
 import Data.Void (Void, absurd)
-import GHC.TypeLits (ErrorMessage((:$$:), (:<>:)), KnownSymbol, Symbol,
-  TypeError, symbolVal)
+import GHC.TypeLits
+  ( ErrorMessage((:$$:), (:<>:)), KnownSymbol, Symbol, TypeError, symbolVal
+  )
 import Language.Elm.Definition (Definition)
 import Language.Elm.Expression ((|>), Expression, if_)
 import Language.Elm.Name (Constructor, Qualified)
 import Language.Elm.Type (Type)
-import Prelude (Applicative(pure), Bool(False, True), Foldable(foldl,
-  foldr), Functor(fmap), Maybe(Just, Nothing), Monad((>>)),
-  Semigroup((<>)), Show(show), ($), (++), (.), (<$>), Int, error, zip)
+import Prelude
+  ( Applicative(pure), Bool(False, True), Foldable(foldl, foldr), Functor(fmap)
+  , Maybe(Just, Nothing), Monad((>>)), Semigroup((<>)), Show(show), ($), (++)
+  , (.), (<$>), Int, error, zip
+  )
 import qualified Data.Char as Char
 import qualified Data.Set as Set
 import qualified Data.Text as Text
@@ -133,7 +139,6 @@
 import qualified Language.Elm.Pattern as Pat
 import qualified Language.Elm.Type as Type
 
-
 {-|
   Generate Elm type, encoder, and decoder 'Definition's for all /named/
   types in a 'Specification'. Note that this will not produce any types,
@@ -356,6 +361,16 @@
   encoderOf = do
     encoder <- encoderOf @spec
     pure $ "Json.Encode.list" `a` encoder
+instance (HasType spec) => HasType (JsonDict spec) where
+  typeOf = do
+    elemType <- typeOf @spec
+    pure $ "Dict.Dict" `ta` "String.String" `ta` elemType
+  decoderOf = do
+    dec <- decoderOf @spec
+    pure $ "Json.Decode.dict" `a` dec
+  encoderOf = do
+    encoder <- encoderOf @spec
+    pure $ "Json.Encode.dict" `a` "Basics.identity" `a` encoder
 instance HasType JsonBool where
   typeOf = pure "Basics.Bool"
   decoderOf = pure "Json.Decode.bool"
