diff --git a/Setup.hs b/Setup.hs
deleted file mode 100644
--- a/Setup.hs
+++ /dev/null
@@ -1,2 +0,0 @@
-import Distribution.Simple
-main = defaultMain
diff --git a/aeson-filthy.cabal b/aeson-filthy.cabal
--- a/aeson-filthy.cabal
+++ b/aeson-filthy.cabal
@@ -1,5 +1,5 @@
 name:                aeson-filthy
-version:             0.1.3
+version:             0.1.4
 homepage:            https://github.com/deviant-logic/aeson-filthy
 bug-reports:         https://github.com/deviant-logic/aeson-filthy/issues
 license:             BSD3
diff --git a/src/Data/Aeson/Filthy.hs b/src/Data/Aeson/Filthy.hs
--- a/src/Data/Aeson/Filthy.hs
+++ b/src/Data/Aeson/Filthy.hs
@@ -24,6 +24,10 @@
 
     , EmptyAsNothing(..)
 
+    -- * EmptyObject
+
+    , EmptyObject(..)
+
     -- * Time
     , RFC2822Time(..)
 
@@ -182,6 +186,28 @@
 instance FromJSON a => FromJSON (EmptyAsNothing a) where
     parseJSON "" = pure $ EmptyAsNothing Nothing
     parseJSON x  = EmptyAsNothing <$> parseJSON x
+
+-- | Sometimes an empty object is all there is (/e.g./ returned instead of HTTP 204).
+--
+-- >>> decode "{}" :: Maybe EmptyObject
+-- Just (EmptyObject {emptyObject = ()})
+--
+-- >> eitherDecode "{\"\":\"\"}" :: Either String EmptyObject
+-- Left "Error in $: parsing EmptyObject failed, encountered non-empty Object"
+--
+-- >>> encode (EmptyObject ())
+-- "{}"
+newtype EmptyObject = EmptyObject { emptyObject :: () }
+    deriving (Eq, Ord, Enum, Bounded, Read, Show, Generic)
+
+instance FromJSON EmptyObject where
+  parseJSON = withObject "EmptyObject" $ \o ->
+    if HM.null o
+       then return $ EmptyObject ()
+       else fail "parsing EmptyObject failed, encountered non-empty Object"
+
+instance ToJSON EmptyObject where
+  toJSON (EmptyObject ()) = object []
 
 -- | A RFC 2822 encoded time value, allowing the modern RFC 2822 format.
 -- These parsers do not currently handle the more messy whitespace and comments
