diff --git a/ChangeLog.md b/ChangeLog.md
--- a/ChangeLog.md
+++ b/ChangeLog.md
@@ -1,5 +1,9 @@
 # Revision history for haskell-lsp-types
 
+## 0.15.0.1 -- 2019-09-07
+
+* Relax base constraints for GHC 8.8
+
 ## 0.15.0.0 -- 2019-07-01
 
 * Normalize URIs to avoid issues with percent encoding (@cocreature)
diff --git a/haskell-lsp-types.cabal b/haskell-lsp-types.cabal
--- a/haskell-lsp-types.cabal
+++ b/haskell-lsp-types.cabal
@@ -1,5 +1,5 @@
 name:                haskell-lsp-types
-version:             0.15.0.0
+version:             0.15.0.1
 synopsis:            Haskell library for the Microsoft Language Server Protocol, data types
 
 description:         An implementation of the types to allow language implementors to
@@ -45,7 +45,7 @@
  -- other-extensions:
   ghc-options:         -Wall
   -- ghc-options:         -Werror
-  build-depends:       base >=4.9 && <4.13
+  build-depends:       base >= 4.9 && < 4.14
                      , aeson >=1.2.2.0
                      , bytestring
                      , data-default
diff --git a/src/Language/Haskell/LSP/Types/Capabilities.hs b/src/Language/Haskell/LSP/Types/Capabilities.hs
--- a/src/Language/Haskell/LSP/Types/Capabilities.hs
+++ b/src/Language/Haskell/LSP/Types/Capabilities.hs
@@ -21,6 +21,9 @@
 -- | Capabilities for full conformance to the LSP specification up until a version.
 -- Some important milestones:
 --
+-- * 3.12 textDocument/prepareRename request
+-- * 3.11 CodeActionOptions provided by the server
+-- * 3.10 hierarchical document symbols, folding ranges
 -- * 3.9 completion item preselect
 -- * 3.8 codeAction literals
 -- * 3.7 related information in diagnostics
@@ -99,7 +102,7 @@
           (Just (CodeLensClientCapabilities dynamicReg))
           (Just (DocumentLinkClientCapabilities dynamicReg))
           (since 3 6 (ColorProviderClientCapabilities dynamicReg))
-          (Just (RenameClientCapabilities dynamicReg))
+          (Just (RenameClientCapabilities dynamicReg (since 3 12 True)))
           (Just (PublishDiagnosticsClientCapabilities (since 3 7 True)))
           (since 3 10 foldingRangeCapability)
     sync =
diff --git a/src/Language/Haskell/LSP/Types/ClientCapabilities.hs b/src/Language/Haskell/LSP/Types/ClientCapabilities.hs
--- a/src/Language/Haskell/LSP/Types/ClientCapabilities.hs
+++ b/src/Language/Haskell/LSP/Types/ClientCapabilities.hs
@@ -564,6 +564,13 @@
                  * Whether rename supports dynamic registration.
                  */
                 dynamicRegistration?: boolean;
+		/**
+		 * The client supports testing for validity of rename operations
+		 * before execution.
+                 *
+                 * Since 3.12.0
+		 */
+		prepareSupport?: boolean;
         };
 
         /**
@@ -896,6 +903,7 @@
 data RenameClientCapabilities =
   RenameClientCapabilities
     { _dynamicRegistration :: Maybe Bool
+    , _prepareSupport :: Maybe Bool
     } deriving (Show, Read, Eq)
 
 $(deriveJSON lspOptions ''RenameClientCapabilities)
diff --git a/src/Language/Haskell/LSP/Types/CodeAction.hs b/src/Language/Haskell/LSP/Types/CodeAction.hs
--- a/src/Language/Haskell/LSP/Types/CodeAction.hs
+++ b/src/Language/Haskell/LSP/Types/CodeAction.hs
@@ -23,7 +23,7 @@
 
 https://github.com/Microsoft/language-server-protocol/blob/master/protocol.md#code-action-request
 
-The code action request is sent from the client to the server tocompute commands
+The code action request is sent from the client to the server to compute commands
 for a given text document and range. These commands are typically code fixes to
 either fix problems or to beautify/refactor code. The result of a
 textDocument/codeAction request is an array of Command literals which are
diff --git a/src/Language/Haskell/LSP/Types/DataTypesJSON.hs b/src/Language/Haskell/LSP/Types/DataTypesJSON.hs
--- a/src/Language/Haskell/LSP/Types/DataTypesJSON.hs
+++ b/src/Language/Haskell/LSP/Types/DataTypesJSON.hs
@@ -18,6 +18,7 @@
 import           Data.Text                                  (Text)
 import qualified Data.Text                                  as T
 import           Language.Haskell.LSP.Types.ClientCapabilities
+import           Language.Haskell.LSP.Types.CodeAction
 import           Language.Haskell.LSP.Types.Command
 import           Language.Haskell.LSP.Types.Constants
 import           Language.Haskell.LSP.Types.Diagnostic
@@ -262,6 +263,30 @@
 -- ---------------------------------------------------------------------
 {-
 /**
+ * Code Action options.
+ */
+export interface CodeActionOptions {
+    /**
+     * CodeActionKinds that this server may return.
+     *
+     * The list of kinds may be generic, such as `CodeActionKind.Refactor`, or the server
+     * may list out every specific kind they provide.
+     */
+    codeActionKinds?: CodeActionKind[];
+}
+-}
+
+data CodeActionOptions =
+  CodeActionOptionsStatic Bool
+  | CodeActionOptions
+    { _codeActionKinds :: Maybe [CodeActionKind]
+    } deriving (Read,Show,Eq)
+
+deriveJSON (lspOptions { sumEncoding = A.UntaggedValue }) ''CodeActionOptions
+
+-- ---------------------------------------------------------------------
+{-
+/**
  * Format document on type options
  */
 interface DocumentOnTypeFormattingOptions {
@@ -308,7 +333,32 @@
 deriveJSON lspOptions ''DocumentLinkOptions
 
 -- ---------------------------------------------------------------------
+{-
+New in 3.12
+----------
 
+/**
+ * Rename options
+ */
+export interface RenameOptions {
+        /**
+         * Renames should be checked and tested before being executed.
+         */
+        prepareProvider?: boolean;
+}
+-}
+
+data RenameOptions =
+  RenameOptionsStatic Bool
+  | RenameOptions
+    { -- |Renames should be checked and tested before being executed.
+      _prepareProvider :: Maybe Bool
+    } deriving (Show, Read, Eq)
+
+deriveJSON lspOptions { sumEncoding = A.UntaggedValue } ''RenameOptions
+
+-- ---------------------------------------------------------------------
+
 {-
 New in 3.0
 -----------
@@ -463,9 +513,11 @@
          */
         workspaceSymbolProvider?: boolean;
         /**
-         * The server provides code actions.
+         * The server provides code actions. The `CodeActionOptions` return type is only
+         * valid if the client signals code action literal support via the property
+         * `textDocument.codeAction.codeActionLiteralSupport`.
          */
-        codeActionProvider?: boolean;
+        codeActionProvider?: boolean | CodeActionOptions;
         /**
          * The server provides code lens.
          */
@@ -662,7 +714,7 @@
       -- | The server provides workspace symbol support.
     , _workspaceSymbolProvider          :: Maybe Bool
       -- | The server provides code actions.
-    , _codeActionProvider               :: Maybe Bool
+    , _codeActionProvider               :: Maybe CodeActionOptions
       -- | The server provides code lens.
     , _codeLensProvider                 :: Maybe CodeLensOptions
       -- | The server provides document formatting.
@@ -672,7 +724,7 @@
       -- | The server provides document formatting on typing.
     , _documentOnTypeFormattingProvider :: Maybe DocumentOnTypeFormattingOptions
       -- | The server provides rename support.
-    , _renameProvider                   :: Maybe Bool
+    , _renameProvider                   :: Maybe RenameOptions
       -- | The server provides document link support.
     , _documentLinkProvider             :: Maybe DocumentLinkOptions
       -- | The server provides color provider support. Since LSP 3.6
@@ -794,8 +846,8 @@
 
 -}
 
-type ShutdownRequest  = RequestMessage ClientMethod (Maybe A.Value) Text
-type ShutdownResponse = ResponseMessage Text
+type ShutdownRequest  = RequestMessage ClientMethod (Maybe A.Value) (Maybe ())
+type ShutdownResponse = ResponseMessage (Maybe ())
 
 -- ---------------------------------------------------------------------
 {-
@@ -2585,6 +2637,51 @@
 
 type RenameRequest  = RequestMessage ClientMethod RenameParams WorkspaceEdit
 type RenameResponse = ResponseMessage WorkspaceEdit
+
+-- ---------------------------------------------------------------------
+{-
+Prepare Rename Request
+
+Since version 3.12.0
+
+The prepare rename request is sent from the client to the server to setup
+and test the validity of a rename operation at a given location.
+
+Request:
+
+    method: ‘textDocument/prepareRename’
+    params: TextDocumentPositionParams
+
+Response:
+
+    result: Range | { range: Range, placeholder: string } | null describing
+            the range of the string to rename and optionally a placeholder
+            text of the string content to be renamed. If null is returned
+            then it is deemed that a ‘textDocument/rename’ request is not
+            valid at the given position.
+    error: code and message set in case an exception happens during the
+           prepare rename request.
+
+-}
+
+-- {\"jsonrpc\":\"2.0\",\"id\":1,\"method\":\"textDocument/rename\",\"params\":{\"textDocument\":{\"uri\":\"file:///home/alanz/mysrc/github/alanz/haskell-lsp/src/HieVscode.hs\"},\"position\":{\"line\":37,\"character\":17},\"newName\":\"getArgs'\"}}
+
+data RangeWithPlaceholder =
+  RangeWithPlaceholder
+    {
+    _range :: Range
+    , _placeholder :: Text
+    }
+
+deriveJSON lspOptions { sumEncoding = A.UntaggedValue } ''RangeWithPlaceholder
+
+data RangeOrRangeWithPlaceholder = RangeWithPlaceholderValue RangeWithPlaceholder
+                                 | RangeValue Range
+
+deriveJSON lspOptions { sumEncoding = A.UntaggedValue } ''RangeOrRangeWithPlaceholder
+
+type PrepareRenameRequest  = RequestMessage ClientMethod TextDocumentPositionParams Range
+type PrepareRenameResponse = ResponseMessage (Maybe RangeOrRangeWithPlaceholder)
 
 -- ---------------------------------------------------------------------
 {-
diff --git a/src/Language/Haskell/LSP/Types/Diagnostic.hs b/src/Language/Haskell/LSP/Types/Diagnostic.hs
--- a/src/Language/Haskell/LSP/Types/Diagnostic.hs
+++ b/src/Language/Haskell/LSP/Types/Diagnostic.hs
@@ -7,6 +7,7 @@
 import           Control.DeepSeq
 import qualified Data.Aeson                                 as A
 import           Data.Aeson.TH
+import           Data.Scientific
 import           Data.Text
 import           GHC.Generics
 import           Language.Haskell.LSP.Types.Constants
@@ -132,12 +133,21 @@
 }
 -}
 
+data NumberOrString =
+  NumberValue Scientific
+  | StringValue Text
+  deriving (Show, Read, Eq, Ord, Generic)
+
+instance NFData NumberOrString
+
+deriveJSON lspOptions { sumEncoding = A.UntaggedValue } ''NumberOrString
+
 type DiagnosticSource = Text
 data Diagnostic =
   Diagnostic
     { _range              :: Range
     , _severity           :: Maybe DiagnosticSeverity
-    , _code               :: Maybe Text -- Note: Protocol allows Int too.
+    , _code               :: Maybe NumberOrString
     , _source             :: Maybe DiagnosticSource
     , _message            :: Text
     , _relatedInformation :: Maybe (List DiagnosticRelatedInformation)
diff --git a/src/Language/Haskell/LSP/Types/Message.hs b/src/Language/Haskell/LSP/Types/Message.hs
--- a/src/Language/Haskell/LSP/Types/Message.hs
+++ b/src/Language/Haskell/LSP/Types/Message.hs
@@ -112,6 +112,7 @@
  | TextDocumentRangeFormatting
  | TextDocumentOnTypeFormatting
  | TextDocumentRename
+ | TextDocumentPrepareRename
  | TextDocumentFoldingRange
  -- A custom message type. It is not enforced that this starts with $/.
  | CustomClientMethod Text
@@ -158,6 +159,7 @@
   parseJSON (A.String "textDocument/rangeFormatting")     = return TextDocumentRangeFormatting
   parseJSON (A.String "textDocument/onTypeFormatting")    = return TextDocumentOnTypeFormatting
   parseJSON (A.String "textDocument/rename")              = return TextDocumentRename
+  parseJSON (A.String "textDocument/prepareRename")       = return TextDocumentPrepareRename
   parseJSON (A.String "textDocument/foldingRange")        = return TextDocumentFoldingRange
   parseJSON (A.String "window/progress/cancel")           = return WindowProgressCancel
   parseJSON (A.String x)                                  = return (CustomClientMethod x)
@@ -202,6 +204,7 @@
   toJSON TextDocumentRangeFormatting     = A.String "textDocument/rangeFormatting"
   toJSON TextDocumentOnTypeFormatting    = A.String "textDocument/onTypeFormatting"
   toJSON TextDocumentRename              = A.String "textDocument/rename"
+  toJSON TextDocumentPrepareRename       = A.String "textDocument/prepareRename"
   toJSON TextDocumentFoldingRange        = A.String "textDocument/foldingRange"
   toJSON TextDocumentDocumentLink        = A.String "textDocument/documentLink"
   toJSON DocumentLinkResolve             = A.String "documentLink/resolve"
diff --git a/src/Language/Haskell/LSP/Types/MessageFuncs.hs b/src/Language/Haskell/LSP/Types/MessageFuncs.hs
--- a/src/Language/Haskell/LSP/Types/MessageFuncs.hs
+++ b/src/Language/Haskell/LSP/Types/MessageFuncs.hs
@@ -329,3 +329,7 @@
 fmClientRenameRequest rid params
   = J.RequestMessage "2.0" rid J.TextDocumentRename params
 
+-- * :leftwards_arrow_with_hook: [textDocument/prepareRename](#textDocument_prepareRename)
+fmClientPrepareRenameRequest :: J.LspId -> J.TextDocumentPositionParams -> J.PrepareRenameRequest
+fmClientPrepareRenameRequest rid params
+  = J.RequestMessage "2.0" rid J.TextDocumentPrepareRename params
