diff --git a/CHANGES.txt b/CHANGES.txt
--- a/CHANGES.txt
+++ b/CHANGES.txt
@@ -1,5 +1,9 @@
 Changelog for HLint
 
+1.9.35
+    #245, fix parse error reports
+    #243, update hlint.ghci to work with modern GHC
+    Require extra-1.4.9
 1.9.34
     #154, fix some incorrect line numbers in literate Haskell
     #161, fix literate Haskell and CPP
diff --git a/README.md b/README.md
--- a/README.md
+++ b/README.md
@@ -97,7 +97,7 @@
 
 ### GHCi Integration
 
-GHCi integration has been provided by Gwern Branwen. The integration allows running `:hlint` from the GHCi prompt. The script is at [hlint.ghci](https://raw.githubusercontent.com/ndmitchell/hlint/master/data/hlint.ghci), and a copy is installed locally in the data directory. To use, add the contents to your [GHCi startup file](http://www.haskell.org/ghc/docs/latest/html/users_guide/ghci-dot-files.html).
+GHCi integration has been provided by Gwern Branwen. The integration allows running `:hlint` from the GHCi prompt. The script is at [hlint.ghci](https://raw.githubusercontent.com/ndmitchell/hlint/master/data/hlint.ghci), and a copy is installed locally in the data directory. To use, add the contents to your [GHCi startup file](https://www.haskell.org/ghc/docs/latest/html/users_guide/ghci.html#the-ghci-and-haskeline-files).
 
 ### Parallel Operation
 
diff --git a/data/hlint.ghci b/data/hlint.ghci
--- a/data/hlint.ghci
+++ b/data/hlint.ghci
@@ -8,11 +8,11 @@
                 [":set -fno-print-bind-result"
                 ,"tmp <- System.Directory.getTemporaryDirectory"
                 ,"(f,h) <- System.IO.openTempFile tmp \"ghci\""
-                ,"sto <- GHC.Handle.hDuplicate System.IO.stdout"
-                ,"GHC.Handle.hDuplicateTo h System.IO.stdout"
+                ,"sto <- GHC.IO.Handle.hDuplicate System.IO.stdout"
+                ,"GHC.IO.Handle.hDuplicateTo h System.IO.stdout"
                 ,"System.IO.hClose h"
                 ,cmd
-                ,"GHC.Handle.hDuplicateTo sto System.IO.stdout"
+                ,"GHC.IO.Handle.hDuplicateTo sto System.IO.stdout"
                 ,"let readFileNow f = readFile f >>= \\t->Data.List.length t `seq` return t"
                 ,var++" <- readFileNow f"
                 ,"System.Directory.removeFile f"
diff --git a/hlint.cabal b/hlint.cabal
--- a/hlint.cabal
+++ b/hlint.cabal
@@ -1,7 +1,7 @@
 cabal-version:      >= 1.8
 build-type:         Simple
 name:               hlint
-version:            1.9.34
+version:            1.9.35
 license:            BSD3
 license-file:       LICENSE
 category:           Development
@@ -52,7 +52,7 @@
         haskell-src-exts >= 1.17 && < 1.18,
         uniplate >= 1.5,
         ansi-terminal >= 0.6.2,
-        extra >= 0.5,
+        extra >= 1.4.9,
         refact >= 0.3
 
     if flag(gpl)
diff --git a/src/HSE/All.hs b/src/HSE/All.hs
--- a/src/HSE/All.hs
+++ b/src/HSE/All.hs
@@ -1,3 +1,4 @@
+{-# LANGUAGE ViewPatterns #-}
 
 module HSE.All(
     module X,
@@ -52,7 +53,11 @@
 runCpp :: CppFlags -> FilePath -> String -> IO String
 runCpp NoCpp _ x = return x
 runCpp CppSimple _ x = return $ unlines [if "#" `isPrefixOf` trimStart x then "" else x | x <- lines x]
-runCpp (Cpphs o) file x = drop 1 . dropWhile (/= '\n') <$> runCpphs o file x
+runCpp (Cpphs o) file x = dropLine <$> runCpphs o file x
+    where
+        -- LINE pragmas always inserted when locations=True
+        dropLine (line1 -> (a,b)) | "{-# LINE " `isPrefixOf` a = b
+        dropLine x = x
 
 
 ---------------------------------------------------------------------
@@ -76,6 +81,7 @@
             ParseOk (x, cs) -> return $ Right (applyFixity fixity x, cs)
             ParseFailed sl msg -> do
                 -- figure out the best line number to grab context from, by reparsing
+                -- but not generating {-# LINE #-} pragmas
                 flags <- return $ parseFlagsNoLocations flags
                 ppstr2 <- runCpp (cppFlags flags) file str
                 let pe = case parseFileContentsWithMode (mode flags) ppstr2 of
