diff --git a/equivalence.cabal b/equivalence.cabal
--- a/equivalence.cabal
+++ b/equivalence.cabal
@@ -1,9 +1,9 @@
 Name:            equivalence
-Version:         0.3.2
+Version:         0.3.3
 License:         BSD3
 License-File:    LICENSE
 Author:          Patrick Bahr
-Maintainer:      paba@di.ku.dk
+Maintainer:      paba@itu.dk
 Homepage:        https://github.com/pa-ba/equivalence
 bug-reports:     https://github.com/pa-ba/equivalence/issues/new
 Synopsis:        Maintaining an equivalence relation implemented as union-find using STT.
@@ -34,12 +34,12 @@
   Other-Modules:	Data.Equivalence.Monad_Test
   hs-source-dirs:	src testsuite/tests
   Build-Depends:        base >= 4, template-haskell, containers, mtl >= 2.0.1, QuickCheck >= 2,
-                        test-framework, test-framework-quickcheck2, STMonadTrans,
+                        test-framework, test-framework-quickcheck2, STMonadTrans >= 0.4.3,
                         transformers >= 0.2, transformers-compat >= 0.3
 
 Library
   Build-Depends:
-    base >= 4 && < 5, containers, mtl >= 2.0.1, STMonadTrans >= 0.4.1,
+    base >= 4 && < 5, containers, mtl >= 2.0.1, STMonadTrans >= 0.4.3,
     transformers >= 0.2, transformers-compat >= 0.3
   Exposed-Modules:
     Data.Equivalence.STT,
diff --git a/src/Data/Equivalence/STT.hs b/src/Data/Equivalence/STT.hs
--- a/src/Data/Equivalence/STT.hs
+++ b/src/Data/Equivalence/STT.hs
@@ -249,20 +249,23 @@
 equateEntry :: (Monad m, Applicative m, Ord a) => Equiv s c a -> Entry s c a -> Entry s c a -> STT s m (Entry s c a)
 equateEntry Equiv {combDesc = mkDesc} repx@(Entry rx) repy@(Entry ry) = 
   if (rx /= ry) then do
-    dx@Root{entryWeight = wx, entryDesc = chx, entryValue = vx} <- readSTRef rx
-    dy@Root{entryWeight = wy, entryDesc = chy, entryValue = vy} <- readSTRef ry
-    if  wx >= wy
-      then do
-        writeSTRef ry Node {entryParent = repx, entryValue = vy}
-        writeSTRef rx dx{entryWeight = wx + wy, entryDesc = mkDesc chx chy}
-        return repx
-      else do
-       writeSTRef rx Node {entryParent = repy, entryValue = vx}
-       writeSTRef ry dy{entryWeight = wx + wy, entryDesc = mkDesc chx chy}
-       return repy
-    else return  repx
-
+    dx <- readSTRef rx
+    dy <- readSTRef ry
+    case (dx, dy) of
+      ( Root{entryWeight = wx, entryDesc = chx, entryValue = vx}
+        , Root{entryWeight = wy, entryDesc = chy, entryValue = vy} ) ->
+        if  wx >= wy
+        then do
+          writeSTRef ry Node {entryParent = repx, entryValue = vy}
+          writeSTRef rx dx{entryWeight = wx + wy, entryDesc = mkDesc chx chy}
+          return repx
+        else do
+          writeSTRef rx Node {entryParent = repy, entryValue = vx}
+          writeSTRef ry dy{entryWeight = wx + wy, entryDesc = mkDesc chx chy}
+          return repy
 
+      _ -> fail "error on `equateEntry`"
+  else return  repx
 
 combineEntries :: (Monad m, Applicative m, Ord a)
                => Equiv s c a -> [b] -> (b -> STT s m (Entry s c a)) -> STT s m ()
