diff --git a/msgpack-types.cabal b/msgpack-types.cabal
--- a/msgpack-types.cabal
+++ b/msgpack-types.cabal
@@ -1,5 +1,5 @@
 name:                 msgpack-types
-version:              0.2.0
+version:              0.2.1
 synopsis:             A Haskell implementation of MessagePack.
 homepage:             http://msgpack.org/
 license:              BSD3
@@ -34,6 +34,7 @@
   other-modules:
       Data.MessagePack.Types.Assoc
       Data.MessagePack.Types.Class
+      Data.MessagePack.Types.DecodeError
       Data.MessagePack.Types.Generic
       Data.MessagePack.Types.Object
   build-depends:
diff --git a/src/Data/MessagePack/Types/DecodeError.hs b/src/Data/MessagePack/Types/DecodeError.hs
new file mode 100644
--- /dev/null
+++ b/src/Data/MessagePack/Types/DecodeError.hs
@@ -0,0 +1,30 @@
+{-# OPTIONS_GHC -Wno-orphans #-}
+{-# LANGUAGE MultiParamTypeClasses #-}
+{-# LANGUAGE Trustworthy           #-}
+module Data.MessagePack.Types.DecodeError
+    ( DecodeError
+    , decodeError
+    , errorMessages
+    ) where
+
+import           Control.Monad.Validate          (MonadValidate (..))
+import           Data.String                     (IsString (..))
+import           Text.ParserCombinators.ReadPrec (ReadPrec)
+
+data DecodeError = DecodeError
+    { errorMessages :: [String]
+    }
+    deriving (Show)
+
+decodeError :: String -> DecodeError
+decodeError = DecodeError . (:[])
+
+instance IsString DecodeError where
+    fromString str = DecodeError [str]
+
+instance Semigroup DecodeError where
+    DecodeError a <> DecodeError b = DecodeError (a <> b)
+
+instance MonadValidate DecodeError ReadPrec where
+    refute = fail . show
+    tolerate m = m >> return Nothing
