diff --git a/ChangeLog.md b/ChangeLog.md
--- a/ChangeLog.md
+++ b/ChangeLog.md
@@ -1,3 +1,21 @@
 # Changelog for math-programming
 
-## Unreleased changes
+## [0.4.0] -- 5 July 2020
+### Added
+
+- The `RealFrac` constraint on `LPMonad` numeric types.
+
+  This simplifies the constraints necessary in application code.
+
+### Removed
+
+- The `writeFormulation` class method.
+
+  This was impossible to implement correctly without requiring
+  `LPMonad` to implement `MonadIO`, which should not be required in
+  general.
+
+
+## [0.3.0] -- 18 June 2020
+
+Initial release.
diff --git a/math-programming.cabal b/math-programming.cabal
--- a/math-programming.cabal
+++ b/math-programming.cabal
@@ -1,6 +1,6 @@
 cabal-version:      1.12
 name:               math-programming
-version:            0.3.0
+version:            0.4.0
 license:            BSD3
 license-file:       LICENSE
 copyright:          2018 Patrick Steele
@@ -51,7 +51,7 @@
     build-depends:
         base >=4.7 && <5,
         containers >=0.6.0.1 && <0.7,
-        math-programming,
+        math-programming -any,
         mtl >=2.2.2 && <2.3,
         tasty >=1.2.3 && <1.3,
         tasty-discover >=4.2.1 && <4.3,
diff --git a/src/Math/Programming/Types.hs b/src/Math/Programming/Types.hs
--- a/src/Math/Programming/Types.hs
+++ b/src/Math/Programming/Types.hs
@@ -16,7 +16,7 @@
 --
 -- We manipulate linear programs and their settings using the
 -- 'Mutable' typeclass.
-class (Monad m, Num (Numeric m)) => LPMonad m where
+class (Monad m, Show (Numeric m), RealFrac (Numeric m)) => LPMonad m where
   -- | The numeric type used in the model.
   type Numeric m :: *
 
@@ -107,9 +107,6 @@
 
   -- | Optimize the continuous relaxation of the model.
   optimizeLP :: m SolutionStatus
-
-  -- | Write out the formulation.
-  writeFormulation :: FilePath -> m ()
 
 -- | A (mixed) integer program.
 --
