diff --git a/CHANGELOG.md b/CHANGELOG.md
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -1,3 +1,6 @@
+* 0.4.0 (pending)
+  - Use row-types 0.3.0 or higher, and the `Overwrite` construct
+    rather than `Modify`
 * 0.3.0
   - Use row-types instead of CTRex.
   - Rename `:->` operator to `:=`.
diff --git a/examples/Door.hs b/examples/Door.hs
--- a/examples/Door.hs
+++ b/examples/Door.hs
@@ -100,8 +100,8 @@
     ( Door m
     -- TODO: Can these constraints be added to the Sugar module
     -- automatically?
-    , Modify n (State m Open) c ~ o
-    , Modify n (State m Closed) o ~ c
+    , ((n .== State m Open) .// c) ~ o
+    , ((n .== State m Closed) .// o) ~ c
     , (o .! n) ~ State m Open
     , (c .! n) ~ State m Closed
     , (o .- n) ~ (c .- n)
diff --git a/motor.cabal b/motor.cabal
--- a/motor.cabal
+++ b/motor.cabal
@@ -1,5 +1,5 @@
 name:                motor
-version:             0.3.0
+version:             0.4.0
 synopsis:
   Type-safe effectful state machines in Haskell
 description:
@@ -35,7 +35,7 @@
                      , indexed
                      , indexed-extras
                      , reflection
-                     , row-types
+                     , row-types >= 0.3.0
                      , template-haskell >= 2.11.1.0
   hs-source-dirs:      src
   default-language:    Haskell2010
diff --git a/src/Motor/FSM.hs b/src/Motor/FSM.hs
--- a/src/Motor/FSM.hs
+++ b/src/Motor/FSM.hs
@@ -1,10 +1,10 @@
-{-# LANGUAGE DataKinds                  #-}
-{-# LANGUAGE FlexibleContexts           #-}
-{-# LANGUAGE FlexibleInstances          #-}
-{-# LANGUAGE PolyKinds                  #-}
-{-# LANGUAGE ScopedTypeVariables        #-}
-{-# LANGUAGE TypeFamilies               #-}
-{-# LANGUAGE TypeOperators              #-}
+{-# LANGUAGE DataKinds           #-}
+{-# LANGUAGE FlexibleContexts    #-}
+{-# LANGUAGE FlexibleInstances   #-}
+{-# LANGUAGE PolyKinds           #-}
+{-# LANGUAGE ScopedTypeVariables #-}
+{-# LANGUAGE TypeFamilies        #-}
+{-# LANGUAGE TypeOperators       #-}
 {- | /Motor/ is an experimental Haskell library for building
    finite-state machines with type-safe transitions and effects. It
    draws inspiration from the Idris
@@ -58,10 +58,10 @@
   , module Control.Monad.Indexed
   ) where
 
-import           Control.Monad.IO.Class
 import           Control.Monad.Indexed
 import           Control.Monad.Indexed.State
 import           Control.Monad.Indexed.Trans
+import           Control.Monad.IO.Class
 import           Data.Functor.Identity       (runIdentity)
 import           Data.Row.Records
 
@@ -127,7 +127,7 @@
   update (Name :: Name n) f = FSM (imodify $ \s -> runIdentity (focus lbl (pure . f) s))
     where
       lbl = Label :: Label n
-  enter (Name :: Name n) x = FSM (imodify $ \s -> runIdentity (focus lbl (const (pure x)) s))
+  enter (Name :: Name n) x = FSM (imodify ((lbl .== x) .//))
     where
       lbl = Label :: Label n
   call (FSM ma) = FSM (ilift (fst <$> runIxStateT ma empty))
diff --git a/src/Motor/FSM/Class.hs b/src/Motor/FSM/Class.hs
--- a/src/Motor/FSM/Class.hs
+++ b/src/Motor/FSM/Class.hs
@@ -36,8 +36,9 @@
   -- | Deletes an existing resource named by its 'Name'.
   delete :: Name n -> m r (r .- n) ()
   -- | Replaces the state of an existing resource named by its 'Name'.
-  enter ::
-       (HasType n a r, Modify n b r ~ r')
+  enter
+    :: ( r' ~ (n .== b .// r)
+       )
     => Name n
     -> b
     -> m r r' ()
diff --git a/src/Motor/FSM/Sugar.hs b/src/Motor/FSM/Sugar.hs
--- a/src/Motor/FSM/Sugar.hs
+++ b/src/Motor/FSM/Sugar.hs
@@ -59,10 +59,10 @@
                             , (r .! n) ~ a
                             )
   FromActions ((n ':= 'To a b) ': ts) r c =
-    FromActions ts (Modify n b r) ( c
-                                  , (r .! n) ~ a
-                                  , (Modify n b r .! n) ~ b
-                                  )
+    FromActions ts ((n .== b) .// r) ( c
+                                     , (r .! n) ~ a
+                                     , (((n .== b) .// r) .! n) ~ b
+                                     )
   FromActions ((n ':= 'Remain a) ': ts) r c =
     FromActions ts r (c, (r .! n) ~ a)
 
diff --git a/test/Motor/FSMSpec.hs b/test/Motor/FSMSpec.hs
--- a/test/Motor/FSMSpec.hs
+++ b/test/Motor/FSMSpec.hs
@@ -20,10 +20,10 @@
 n2 :: Name "n2"
 n2 = Name
 
-s1s2 :: MonadFSM m => Name n -> m r (Modify n S2 r) ()
+s1s2 :: MonadFSM m => Name n -> m r ((n .== S2) .// r) ()
 s1s2 s = enter s S2
 
-s2s1 :: MonadFSM m => Name n -> m r (Modify n S1 r) ()
+s2s1 :: MonadFSM m => Name n -> m r ((n .== S1) .// r) ()
 s2s1 s = enter s S1
 
 
