diff --git a/CHANGES.txt b/CHANGES.txt
--- a/CHANGES.txt
+++ b/CHANGES.txt
@@ -1,5 +1,8 @@
 Changelog for HLint (* = breaking change)
 
+2.1.14, released 2019-01-28
+    #587, fix extensions implied by ImplicitParams
+    #588, suggest optional from attoparsec
 2.1.13, released 2019-01-23
     #583, suggest left sections to avoid lambdas
     #580, remove redundant LANGUAGE pragmas which are implied by others
diff --git a/README.md b/README.md
--- a/README.md
+++ b/README.md
@@ -68,7 +68,7 @@
 
 On the CI you should then run `hlint .` (or `hlint src` if you only want to check the `src` directory). To avoid the cost of compilation you may wish to fetch the [latest HLint binary release](https://github.com/ndmitchell/hlint/releases/latest). For certain CI environments there are helper scripts to do that.
 
-**Travis:** Execute the following command:
+**Travis (Linux, Mac, Windows):** Execute the following command:
 
 ```sh
 curl -sSL https://raw.github.com/ndmitchell/hlint/master/misc/travis.sh | sh -s .
@@ -76,7 +76,7 @@
 
 The arguments after `-s` are passed to `hlint`, so modify the final `.` if you want other arguments.
 
-**Appveyor:** Add the following statement to `.appveyor.yml`:
+**Appveyor (Windows only):** Add the following statement to `.appveyor.yml`:
 
 ```powershell
 - ps: Invoke-Command ([Scriptblock]::Create((Invoke-WebRequest 'https://raw.githubusercontent.com/ndmitchell/hlint/master/misc/appveyor.ps1').Content)) -ArgumentList @('.')
diff --git a/data/hlint.yaml b/data/hlint.yaml
--- a/data/hlint.yaml
+++ b/data/hlint.yaml
@@ -43,6 +43,12 @@
     - import Control.Lens.Operators
     - import Control.Monad.Reader
 
+- package:
+    name: attoparsec
+    modules:
+    - import Data.Attoparsec.Text
+    - import Data.Attoparsec.ByteString
+
 - group:
     name: default
     enabled: true
@@ -657,6 +663,16 @@
     - error: {lhs: "Control.Lens.has (a . Control.Lens.at b)", rhs: "Control.Lens.has a"}
     - error: {lhs: "Control.Lens.nullOf (Control.Lens.at a)", rhs: "False"}
     - error: {lhs: "Control.Lens.nullOf (a . Control.Lens.at b)", rhs: "Control.Lens.nullOf a"}
+
+- group:
+    name: attoparsec
+    enabled: true
+    imports:
+    - package base
+    - package attoparsec
+    rules:
+    - warn: {lhs: Data.Attoparsec.Text.option Nothing (Just <$> p),       rhs: optional p}
+    - warn: {lhs: Data.Attoparsec.ByteString.option Nothing (Just <$> p), rhs: optional p}
 
 - group:
     name: generalise
diff --git a/hlint.cabal b/hlint.cabal
--- a/hlint.cabal
+++ b/hlint.cabal
@@ -1,7 +1,7 @@
 cabal-version:      >= 1.18
 build-type:         Simple
 name:               hlint
-version:            2.1.13
+version:            2.1.14
 license:            BSD3
 license-file:       LICENSE
 category:           Development
diff --git a/src/HSE/Util.hs b/src/HSE/Util.hs
--- a/src/HSE/Util.hs
+++ b/src/HSE/Util.hs
@@ -398,7 +398,8 @@
 extensionImpliedBy = \x -> Map.findWithDefault [] x mp
     where mp = Map.fromListWith (++) [(b, [a]) | (a,bs) <- extensionImplications, b <- bs]
 
--- | (a, bs) means extension a implies all of bs
+-- | (a, bs) means extension a implies all of bs.
+--   Taken from https://downloads.haskell.org/~ghc/master/users-guide/glasgow_exts.html#language-options
 extensionImplications :: [(Extension, [Extension])]
 extensionImplications = map (first EnableExtension) $
     (RebindableSyntax, [DisableExtension ImplicitPrelude]) :
@@ -410,7 +411,8 @@
     , (FunctionalDependencies   , [MultiParamTypeClasses])
     , (GADTs                    , [MonoLocalBinds])
     , (IncoherentInstances      , [OverlappingInstances])
-    , (ImplicitParams           , [FlexibleContexts, FlexibleInstances])
+--    Incorrect, see https://github.com/ndmitchell/hlint/issues/587
+--    , (ImplicitParams           , [FlexibleContexts, FlexibleInstances])
     , (ImpredicativeTypes       , [ExplicitForAll, RankNTypes])
     , (LiberalTypeSynonyms      , [ExplicitForAll])
     , (PolyKinds                , [KindSignatures])
