diff --git a/CHANGELOG.markdown b/CHANGELOG.markdown
--- a/CHANGELOG.markdown
+++ b/CHANGELOG.markdown
@@ -1,3 +1,7 @@
+/1.4/
+
+ * Simplified MonadSpec
+
 /1.3/
 
  * Removed old benchmark/test framework.
diff --git a/Control/Concurrent/Speculation/Class.hs b/Control/Concurrent/Speculation/Class.hs
--- a/Control/Concurrent/Speculation/Class.hs
+++ b/Control/Concurrent/Speculation/Class.hs
@@ -17,36 +17,37 @@
 
 import Control.Monad.Trans.Cont
 import Control.Concurrent.Speculation
+import Data.Function (on)
 
 class MonadSpec m where
-  -- | When a is unevaluated, @'spec' g a@ evaluates the current continuation 
-  -- with @g@ while testing if @g@ '==' @a@, if they differ, it re-evalutes the
-  -- continuation with @a@. If @a@ was already evaluated, the continuation is
-  -- just directly applied to @a@ instead.
-  specM :: Eq a => a -> a -> m a
-
-  -- | As per 'spec', without the check for whether or not the second argument
-  -- is already evaluated.
-  specM' :: Eq a => a -> a -> m a
-
   -- | @spec@ with a user supplied comparison function
   specByM :: (a -> a -> Bool) -> a -> a -> m a
 
   -- | @spec'@ with a user supplied comparison function
   specByM' :: (a -> a -> Bool) -> a -> a -> m a
 
-  -- | @spec'@ with a user supplied comparison function
-  specOnM :: Eq c => (a -> c) -> a -> a -> m a
+-- | When a is unevaluated, @'spec' g a@ evaluates the current continuation 
+-- with @g@ while testing if @g@ '==' @a@, if they differ, it re-evalutes the
+-- continuation with @a@. If @a@ was already evaluated, the continuation is
+-- just directly applied to @a@ instead.
+specM :: (MonadSpec m, Eq a) => a -> a -> m a
+specM = specByM (==)
 
-  -- | @spec'@ with a user supplied comparison function
-  specOnM' :: Eq c => (a -> c) -> a -> a -> m a
+-- | As per 'spec', without the check for whether or not the second argument
+-- is already evaluated.
+specM' :: (MonadSpec m, Eq a) => a -> a -> m a
+specM' = specByM' (==)
 
+-- | @spec'@ with a user supplied comparison function
+specOnM :: (MonadSpec m, Eq c) => (a -> c) -> a -> a -> m a
+specOnM = specByM . on (==)
+
+-- | @spec'@ with a user supplied comparison function
+specOnM' :: (MonadSpec m, Eq c) => (a -> c) -> a -> a -> m a
+specOnM' = specByM . on (==)
+
 -- * Basic speculation
 
 instance Monad m => MonadSpec (ContT r m) where
-  specM g a = ContT $ \k -> spec g k a
-  specM' g a = ContT $ \k -> spec' g k a
   specByM f g a = ContT $ \k -> specBy f g k a
   specByM' f g a = ContT $ \k -> specBy' f g k a
-  specOnM f g a = ContT $ \k -> specOn f g k a
-  specOnM' f g a = ContT $ \k -> specOn' f g k a
diff --git a/speculation.cabal b/speculation.cabal
--- a/speculation.cabal
+++ b/speculation.cabal
@@ -1,5 +1,5 @@
 name:           speculation
-version:        1.3
+version:        1.4
 license:        BSD3
 license-file:   LICENSE
 author:         Edward A. Kmett
