diff --git a/CHANGELOG.md b/CHANGELOG.md
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -1,5 +1,18 @@
 # Revision history for servant-xml-conduit
 
+## [0.1.0.4] - 2023-11-23
+
+### Fixed
+
+- version bump because haddock didn't refresh candidate properly
+
+## [0.1.0.3] - 2023-11-23
+
+### Fixed
+
+- documentation generation (add `cabal.project` with `allow-newer` for `base`)
+- fix overlapping instances
+
 ## [0.1.0.2] - 2023-11-23
 
 ### Added
diff --git a/servant-xml-conduit.cabal b/servant-xml-conduit.cabal
--- a/servant-xml-conduit.cabal
+++ b/servant-xml-conduit.cabal
@@ -20,7 +20,7 @@
 -- PVP summary:     +-+------- breaking API changes
 --                  | | +----- non-breaking API additions
 --                  | | | +--- code changes with no API change
-version:            0.1.0.2
+version:            0.1.0.4
 
 -- A short (one-line) description of the package.
 synopsis: Servant XML content-type with support for xml-conduit
diff --git a/src/Servant/XML/Conduit.hs b/src/Servant/XML/Conduit.hs
--- a/src/Servant/XML/Conduit.hs
+++ b/src/Servant/XML/Conduit.hs
@@ -1,6 +1,3 @@
-{-# LANGUAGE FlexibleContexts #-}
-{-# LANGUAGE UndecidableInstances #-}
-
 {-|
 Module      : Servant.XML.Conduit
 Description : Servant bindings for XML using xml-conduit
@@ -14,6 +11,7 @@
 module Servant.XML.Conduit where
 
 import Data.Bifunctor (first)
+import Data.ByteString.Lazy qualified as BSL
 import Network.HTTP.Media qualified as M
 import Servant.API
 import Text.XML qualified as XML
@@ -24,7 +22,42 @@
 instance Accept XML where
   contentType _ = "application" M.// "xml" M./: ("charset", "utf-8")
 
-instance {-# OVERLAPPING #-} MimeUnrender XML XML.Document where
-  mimeUnrender _ bs = first show $ XML.parseLBS XML.def bs
 instance MimeRender XML XML.Document where
   mimeRender _ doc = XML.renderLBS XML.def doc
+
+{-| Function to decode a lazy `ByteString' into 'XML.Document'. The
+  reason we don't privde a @'MimeUnrender' 'XML' 'XML.Document'@ instance is
+  that we don't want to force users with a predefined 'FromXML'
+  typeclass.
+
+  If we added
+
+  @
+    instance 'MimeUnrender' 'XML' 'XML.Document' where
+      mimeUnrender _ bs = first show $ 'XML.parseLBS' 'XML.def' bs
+  @
+
+  we immediately arrive at overlapping instances problem when we try to define
+
+  @
+    instance FromXML a => 'MimeUnrender' 'XML' a ...
+  @
+
+  So, just define this in your code:
+
+  @
+    data ParseError =
+      ErrorNoElementFound Text
+      | ...
+
+    class FromXML a where
+      fromXML :: (Functor m, Applicative m, MonadError ParseError m) => 'Text.XML.Cursor.Cursor' -> m a
+
+    instance (FromXML a) => 'MimeUnrender' 'XML' a where
+      mimeUnrender _ctype bs = case 'mimeUnrenderXML' bs of
+        Left err -> Left err
+        Right doc -> first show $ fromXML ('Text.XML.Cursor.fromDocument' doc)
+  @
+-}
+mimeUnrenderXML :: BSL.ByteString -> Either String XML.Document
+mimeUnrenderXML bs = first show $ XML.parseLBS XML.def bs
