diff --git a/ChangeLog b/ChangeLog
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,5 @@
+0.28.6
+ - Update for GHC 8.6.*
 0.28.3
  - Switch to language-c 0.7.1 [#192]
 0.28.2
diff --git a/c2hs.cabal b/c2hs.cabal
--- a/c2hs.cabal
+++ b/c2hs.cabal
@@ -1,5 +1,5 @@
 Name:           c2hs
-Version:        0.28.5
+Version:        0.28.6
 License:        GPL-2
 License-File:   COPYING
 Copyright:      Copyright (c) 1999-2007 Manuel M T Chakravarty
@@ -121,6 +121,9 @@
         Build-Depends: base >= 3, process, directory, array, containers, pretty
     else
         Build-Depends: base < 3
+
+    if !impl(ghc >= 8.0)
+        Build-Depends: fail
 
     hs-source-dirs: src
     main-is:        Main.hs
diff --git a/doc/c2hs.xml b/doc/c2hs.xml
--- a/doc/c2hs.xml
+++ b/doc/c2hs.xml
@@ -531,7 +531,7 @@
     functions.  By default they are assumed to be pure functions; if they have
     to be executed in the <literal>IO</literal> monad, the function name needs
     to be followed by a star symbol <literal>*</literal>.  Alternatively, the
-    identifier may be followed by a minux sign <literal>-</literal>, in which
+    identifier may be followed by a minus sign <literal>-</literal>, in which
     case the Haskell type does <emphasis>not</emphasis> appear as an argument
     (in marshaller) or result (out marshaller) of the generated Haskell
     function.  In other words, the argument types of the Haskell function is
diff --git a/src/Control/StateBase.hs b/src/Control/StateBase.hs
--- a/src/Control/StateBase.hs
+++ b/src/Control/StateBase.hs
@@ -58,6 +58,7 @@
 
 import Control.Applicative (Applicative(..))
 import Control.Monad (liftM, ap)
+import Control.Monad.Fail (MonadFail (..))
 
 -- state used in the whole compiler
 -- --------------------------------
@@ -82,6 +83,9 @@
 --
 
 newtype PreCST e s a = CST (STB (BaseState e) s a)
+
+instance MonadFail (PreCST a b) where
+    fail = error
 
 instance Functor (PreCST e s) where
   fmap = liftM
diff --git a/src/Data/Errors.hs b/src/Data/Errors.hs
--- a/src/Data/Errors.hs
+++ b/src/Data/Errors.hs
@@ -17,7 +17,7 @@
 --
 --- DESCRIPTION ---------------------------------------------------------------
 --
---  This modules exports some auxilliary routines for error handling.
+--  This modules exports some auxiliary routines for error handling.
 --
 --- DOCU ----------------------------------------------------------------------
 --
@@ -71,7 +71,7 @@
 errorAtPos         :: Position -> [String] -> a
 errorAtPos pos      = error
                       --FIXME: should be using show here, but Show instance
-                      --       for CError from language-c is wierd
+                      --       for CError from language-c is weird
                     . showErrorInfo "" . errorInfo
                     . makeError LevelError pos
 
