diff --git a/CHANGELOG.md b/CHANGELOG.md
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -1,3 +1,7 @@
+## 0.2.1.0
+
+Add `Bluefin.Contrib.Operators` and `Bluefin.Contrib.Operators.Clashing`
+
 ## 0.2.0.0
 
 * Transitive version bump because of choice of different incoherent
diff --git a/bluefin-contrib.cabal b/bluefin-contrib.cabal
--- a/bluefin-contrib.cabal
+++ b/bluefin-contrib.cabal
@@ -1,6 +1,6 @@
 cabal-version:      3.0
 name:               bluefin-contrib
-version:            0.2.0.0
+version:            0.2.1.0
 license:            MIT
 license-file:       LICENSE
 author:             Tom Ellis
@@ -75,7 +75,9 @@
     default-language: Haskell2010
     hs-source-dirs: src
     build-depends:
-      base >= 4.12 && < 4.22,
-      bluefin >= 0.2.0.0 && < 0.3
+      base >= 4.12 && < 4.23,
+      bluefin >= 0.2.0.0 && < 0.5
     exposed-modules:
-      Bluefin.Contrib.State
+      Bluefin.Contrib.State,
+      Bluefin.Contrib.Operators,
+      Bluefin.Contrib.Operators.Clashing
diff --git a/src/Bluefin/Contrib/Operators.hs b/src/Bluefin/Contrib/Operators.hs
new file mode 100644
--- /dev/null
+++ b/src/Bluefin/Contrib/Operators.hs
@@ -0,0 +1,64 @@
+-- |
+--
+-- @
+-- -- ghci> example
+-- -- Triangular number 1 is 0
+-- -- Triangular number 2 is 1
+-- -- Triangular number 3 is 3
+-- -- Triangular number 4 is 6
+-- -- Triangular number 5 is 10
+-- example :: IO ()
+-- example = runEff $ \\io -> evalState @Int 0 $ \\st -> do
+--   for_ [1..5] $ \\i -> do
+--     n <- get st
+--     let msg = "Triangular number " <> show i <> " is " <> show n
+--     effIO io (putStrLn msg)
+--     st += i
+-- @
+--
+-- For @('Bluefin.Contrib.Operators.Clashing.>>=')@ and
+-- @('Bluefin.Contrib.Operators.Clashing./=')@, which clash with
+-- operators from 'Prelude' of the same name, see
+-- "Bluefin.Contrib.Operators.Clashing".
+module Bluefin.Contrib.Operators
+  ( (+=),
+    (-=),
+    (*=),
+    (%=),
+    (&=),
+    (|=),
+    (^=),
+    (<<=),
+  )
+where
+
+import Bluefin.Eff (Eff, (:>))
+import Bluefin.State (State, modify)
+import Data.Bits (Bits, shiftL, xor, (.&.), (.|.))
+
+(+=) :: (e :> es, Num a) => State a e -> a -> Eff es ()
+(+=) = opEquals (+)
+
+(-=) :: (e :> es, Num a) => State a e -> a -> Eff es ()
+(-=) = opEquals (-)
+
+(*=) :: (e :> es, Num a) => State a e -> a -> Eff es ()
+(*=) = opEquals (*)
+
+(%=) :: (e :> es, Integral a) => State a e -> a -> Eff es ()
+(%=) = opEquals mod
+
+(&=) :: (e :> es, Bits a) => State a e -> a -> Eff es ()
+(&=) = opEquals (.&.)
+
+(|=) :: (e :> es, Bits a) => State a e -> a -> Eff es ()
+(|=) = opEquals (.|.)
+
+(^=) :: (e :> es, Bits a) => State a e -> a -> Eff es ()
+(^=) = opEquals xor
+
+(<<=) :: (e :> es, Bits a) => State a e -> Int -> Eff es ()
+(<<=) = opEquals shiftL
+
+opEquals :: (e :> es) => (s -> p -> s) -> State s e -> p -> Eff es ()
+opEquals op st n = modify st (`op` n)
diff --git a/src/Bluefin/Contrib/Operators/Clashing.hs b/src/Bluefin/Contrib/Operators/Clashing.hs
new file mode 100644
--- /dev/null
+++ b/src/Bluefin/Contrib/Operators/Clashing.hs
@@ -0,0 +1,19 @@
+module Bluefin.Contrib.Operators.Clashing
+  ( (/=),
+    (>>=),
+  )
+where
+
+import Bluefin.Eff (Eff, (:>))
+import Bluefin.State (State, modify)
+import Data.Bits (Bits, shiftR)
+import Prelude hiding ((/=), (>>=))
+
+(/=) :: (e :> es, Fractional a) => State a e -> a -> Eff es ()
+(/=) = opEquals (/)
+
+(>>=) :: (e :> es, Bits a) => State a e -> Int -> Eff es ()
+(>>=) = opEquals shiftR
+
+opEquals :: (e :> es) => (a -> b -> a) -> State a e -> b -> Eff es ()
+opEquals op st n = modify st (`op` n)
