diff --git a/CHANGELOG.md b/CHANGELOG.md
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -1,6 +1,11 @@
 # Revision history for haskell-candid
 
-## 0.4-- 2022-11-05
+## 0.4.0.1 -- 2023-01-01
+
+* Bump dependencies
+* GHC-9.4 and transformer-0.6 compat
+
+## 0.4 -- 2022-11-05
 
 * Fix did file parsing bug: Allow underscores in unicode escapes
 * Implement the new subtyping rules from spec version 0.1.4
diff --git a/candid.cabal b/candid.cabal
--- a/candid.cabal
+++ b/candid.cabal
@@ -1,6 +1,6 @@
 cabal-version:      >=1.10
 name:               candid
-version:            0.4
+version:            0.4.0.1
 license:            Apache
 license-file:       LICENSE
 maintainer:         mail@joachim-breitner.de
@@ -48,15 +48,15 @@
     ghc-options:      -Wall -Wno-name-shadowing
     build-depends:
         base >=4.12 && <5,
-        text >=1.2.3.1 && <1.3,
+        text >=1.2.3.1 && <2.1,
         dlist >=0.8.0.8 && <1.1,
-        vector >=0.12.1.2 && <0.13,
+        vector >=0.12.1.2 && <0.14,
         bytestring >=0.10.8.2 && <0.12,
-        mtl >=2.2.2 && <2.3,
-        transformers >=0.5.6.2 && <0.6,
+        mtl >=2.2.2 && <2.4,
+        transformers >=0.5.6.2 && <0.7,
         hex-text >=0.1.0.0 && <0.2,
         crc >=0.1.0.0 && <0.2,
-        megaparsec >=8 && <9.3,
+        megaparsec >=8 && <9.4,
         parser-combinators >=1.2 && <1.4,
         scientific >=0.3.6.2 && <0.4,
         cereal >=0.5.8.1 && <0.6,
@@ -79,7 +79,7 @@
         base ==4.*,
         candid -any,
         optparse-applicative >=0.15.1.0 && <0.18,
-        text >=1.2.3.1 && <1.3,
+        text >=1.2.3.1 && <2.1,
         bytestring >=0.10.8.2 && <0.12,
         hex-text >=0.1.0.0 && <0.2,
         prettyprinter >=1.6.2 && <1.8
@@ -105,8 +105,8 @@
         smallcheck >=1.2 && <1.3,
         candid -any,
         bytestring >=0.10.8.2 && <0.12,
-        text >=1.2.3.1 && <1.3,
-        vector >=0.12.1.2 && <0.13,
+        text >=1.2.3.1 && <2.1,
+        vector >=0.12.1.2 && <0.14,
         prettyprinter >=1.6.2 && <1.8,
         unordered-containers >=0.2.10.0 && <0.3,
         row-types > 1.0.0.0 && < 1.1,
diff --git a/src/Codec/Candid/Class.hs b/src/Codec/Candid/Class.hs
--- a/src/Codec/Candid/Class.hs
+++ b/src/Codec/Candid/Class.hs
@@ -31,9 +31,7 @@
 import qualified Data.Row.Internal as R
 import qualified Data.Row.Variants as V
 import Data.Row.Internal (metamorph)
-import Control.Monad.State.Lazy
-import Control.Monad.Trans.Error
-import Control.Applicative ((<|>))
+import Control.Monad
 import Data.Functor.Const
 import Data.Bifunctor
 import Data.Proxy
@@ -135,9 +133,6 @@
     | MissingFieldError FieldName -- ^ can be recovered
     | UnexpectedTagError FieldName -- ^ can be recovered
 
--- TODO: Can we get rid of this?
-instance Error DeserializeError where strMsg = DecodeError
-
 isRecoverable :: DeserializeError -> Bool
 isRecoverable (DecodeError _) = False
 isRecoverable _ = True
@@ -467,11 +462,12 @@
       where (t, val) = V.eraseWithLabels @Candid toCandidVal v
 
     fromCandidVal' (VariantV f v) = do
-        needle :: V.Var (V.Map (Either DeserializeError) r) <-
+        needle  <-
+            maybe (unexpectedTag f) return $
             (V.fromLabelsMap @Candid @_ @_ @r $ \l -> do
                 guard (f == unescapeFieldName (R.toKey l))
                 return $ fromCandidVal'' v
-            ) <|> unexpectedTag f
+            )
         V.sequence (needle :: V.Var (V.Map (Either DeserializeError) r))
     fromCandidVal' v = cannotCoerce "variant" v
 
diff --git a/src/Codec/Candid/Coerce.hs b/src/Codec/Candid/Coerce.hs
--- a/src/Codec/Candid/Coerce.hs
+++ b/src/Codec/Candid/Coerce.hs
@@ -15,6 +15,7 @@
 import qualified Data.Map as M
 import Control.Monad.State.Lazy
 import Control.Monad.Except
+import Control.Monad
 
 import Codec.Candid.FieldName
 import Codec.Candid.Types
diff --git a/src/Codec/Candid/Decode.hs b/src/Codec/Candid/Decode.hs
--- a/src/Codec/Candid/Decode.hs
+++ b/src/Codec/Candid/Decode.hs
@@ -10,12 +10,12 @@
 import qualified Data.Text.Encoding as T
 import qualified Data.ByteString.Lazy as BS
 import qualified Data.Map as M
-import Control.Monad.State.Lazy
 import Data.List
 import Data.Void
 import Data.Serialize.LEB128.Lenient
 import qualified Data.Serialize.Get as G
 import qualified Data.Serialize.IEEE754 as G
+import Control.Monad
 
 import Codec.Candid.Data
 import Codec.Candid.TypTable
diff --git a/src/Codec/Candid/Encode.hs b/src/Codec/Candid/Encode.hs
--- a/src/Codec/Candid/Encode.hs
+++ b/src/Codec/Candid/Encode.hs
@@ -21,6 +21,7 @@
 import Control.Monad.RWS.Lazy
 import Data.Serialize.LEB128
 import Prettyprinter
+import Control.Monad
 
 import Codec.Candid.Data
 import Codec.Candid.TypTable
diff --git a/src/Codec/Candid/Subtype.hs b/src/Codec/Candid/Subtype.hs
--- a/src/Codec/Candid/Subtype.hs
+++ b/src/Codec/Candid/Subtype.hs
@@ -17,6 +17,7 @@
 import Control.Monad.State.Lazy
 import Control.Monad.Except
 import Control.Monad.Trans.Except
+import Control.Monad
 
 import Codec.Candid.Types
 import Codec.Candid.TypTable
diff --git a/src/Codec/Candid/TypTable.hs b/src/Codec/Candid/TypTable.hs
--- a/src/Codec/Candid/TypTable.hs
+++ b/src/Codec/Candid/TypTable.hs
@@ -20,6 +20,7 @@
 import Data.DList (singleton, DList)
 import Data.Graph
 import Data.Foldable
+import Control.Monad
 
 import Codec.Candid.Types
 
