diff --git a/README.md b/README.md
--- a/README.md
+++ b/README.md
@@ -1,8 +1,8 @@
-# hindent [![Hackage](https://img.shields.io/hackage/v/hindent.svg?style=flat)](https://hackage.haskell.org/package/hindent) [![Build Status](https://travis-ci.org/commercialhaskell/hindent.svg)](https://travis-ci.org/commercialhaskell/hindent)
+# hindent [![Hackage](https://img.shields.io/hackage/v/hindent.svg?style=flat)](https://hackage.haskell.org/package/hindent) ![CI (Stack)](https://github.com/mihaimaruseac/hindent/workflows/CI%20(Stack)/badge.svg) ![CI (Cabal)](https://github.com/mihaimaruseac/hindent/workflows/CI%20(Cabal)/badge.svg)
 
 Haskell pretty printer
 
-[Examples](https://github.com/commercialhaskell/hindent/blob/master/TESTS.md)
+[Examples](https://github.com/mihaimaruseac/hindent/blob/master/TESTS.md)
 
 ## Install
 
@@ -43,14 +43,32 @@
 indent-size: 2
 line-length: 80
 force-trailing-newline: true
+line-breaks: [":>", ":<|>"]
+extensions:
+  - DataKinds
+  - GADTs
+  - TypeApplications
 ```
 
-By default, HIndent preserves the newline or lack of newline in your input. With `force-trailing-newline`, it will make sure there is always a trailing newline.
+By default, hindent preserves the newline or lack of newline in your input. With `force-trailing-newline`, it will make sure there is always a trailing newline.
 
+hindent can be forced to insert a newline before specific operators and tokens with `line-breaks`. This is especially useful when utilizing libraries like [`servant`](https://www.servant.dev/) which use long type aliases.
+
+Using `extensions`, hindent can be made aware of valid syntactic compiler extensions that would normally be considered invalid syntax.
+
+It is also possible to specify which extensions HIndent runs
+with in your `.hindent.yaml`:
+
+```yaml
+extensions:
+  - MagicHash
+  - RecursiveDo
+```
+
 ## Emacs
 
 In
-[elisp/hindent.el](https://github.com/commercialhaskell/hindent/blob/master/elisp/hindent.el)
+[elisp/hindent.el](https://github.com/mihaimaruseac/hindent/blob/master/elisp/hindent.el)
 there is `hindent-mode`, which provides keybindings to reindent parts of the
 buffer:
 
diff --git a/elisp/hindent.el b/elisp/hindent.el
--- a/elisp/hindent.el
+++ b/elisp/hindent.el
@@ -169,7 +169,7 @@
           (insert new-string))))))
 
 ;;;###autoload
-(define-obsolete-function-alias 'hindent/reformat-decl 'hindent-reformat-decl)
+(define-obsolete-function-alias 'hindent/reformat-decl 'hindent-reformat-decl "hindent 5.2.2")
 
 
 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
@@ -213,22 +213,19 @@
                                   (goto-char (point-max))
                                   (when (looking-back "\n" (1- (point)))
                                     (delete-char -1)))
+				(delete-trailing-whitespace)
                                 (buffer-string))))
                 (if (not (string= new-str orig-str))
-                    (let ((line (line-number-at-pos))
-                          (col (current-column)))
-                      (delete-region beg
-                                     end)
-                      (let ((new-start (point)))
-                        (insert new-str)
-                        (let ((new-end (point)))
-                          (goto-char (point-min))
-                          (forward-line (1- line))
-                          (goto-char (+ (line-beginning-position) col))
-                          (when (looking-back "^[ ]+" (line-beginning-position))
-                            (back-to-indentation))
-                          (delete-trailing-whitespace new-start new-end)))
-                      (message "Formatted."))
+		    (progn
+		      (if (fboundp 'replace-region-contents)
+			  (replace-region-contents
+			   beg end (lambda () temp))
+			(let ((line (line-number-at-pos))
+			      (col (current-column)))
+			  (delete-region beg
+					 end)
+			  (insert new-str)))
+		      (message "Formatted."))
                   (message "Already formatted.")))))))))))
 
 (defun hindent-decl-points ()
diff --git a/hindent.cabal b/hindent.cabal
--- a/hindent.cabal
+++ b/hindent.cabal
@@ -1,20 +1,20 @@
 name:                hindent
-version:             5.3.1
+version:             5.3.2
 synopsis:            Extensible Haskell pretty printer
 description:         Extensible Haskell pretty printer. Both a library and an executable.
                      .
-                     See the Github page for usage\/explanation: <https://github.com/commercialhaskell/hindent>
+                     See the Github page for usage\/explanation: <https://github.com/mihaimaruseac/hindent>
 license:             BSD3
 stability:           Unstable
 license-file:        LICENSE.md
-author:              Chris Done, Andrew Gibiansky, Tobias Pflug, Pierre Radermecker
-maintainer:          chrisdone@gmail.com
-copyright:           2014 Chris Done, 2015 Andrew Gibiansky
+author:              Mihai Maruseac, Chris Done, Andrew Gibiansky, Tobias Pflug, Pierre Radermecker
+maintainer:          mihaimaruseac@gmail.com
+copyright:           2014 Chris Done, 2015 Andrew Gibiansky, 2021 Mihai Maruseac
 category:            Development
 build-type:          Simple
-cabal-version:       >=1.8
-homepage:            https://github.com/commercialhaskell/hindent
-bug-reports:         https://github.com/commercialhaskell/hindent/issues
+cabal-version:       >=1.10
+homepage:            https://github.com/mihaimaruseac/hindent
+bug-reports:         https://github.com/mihaimaruseac/hindent/issues
 data-files:          elisp/hindent.el
 extra-source-files:
  README.md
@@ -24,11 +24,12 @@
 
 source-repository head
     type:           git
-    location:       https://github.com/commercialhaskell/hindent
+    location:       https://github.com/mihaimaruseac/hindent
 
 library
   hs-source-dirs:    src/
   ghc-options:       -Wall -O2
+  default-language:  Haskell2010
   exposed-modules:   HIndent
                      HIndent.Types
                      HIndent.Pretty
@@ -52,6 +53,7 @@
 executable hindent
   hs-source-dirs:    src/main
   ghc-options:       -Wall -O2
+  default-language:  Haskell2010
   main-is:           Main.hs
   other-modules: Path.Find
   build-depends:     base >= 4 && < 5
@@ -74,6 +76,7 @@
 test-suite hindent-test
   type: exitcode-stdio-1.0
   hs-source-dirs: src/main/
+  default-language:  Haskell2010
   main-is: Test.hs
   other-modules: Markdone
   build-depends:     base >= 4 && <5
@@ -93,6 +96,7 @@
 benchmark hindent-bench
   type: exitcode-stdio-1.0
   hs-source-dirs:    src/main
+  default-language:  Haskell2010
   ghc-options:       -Wall -O2 -rtsopts
   main-is:           Benchmark.hs
   other-modules: Markdone
diff --git a/src/HIndent/Pretty.hs b/src/HIndent/Pretty.hs
--- a/src/HIndent/Pretty.hs
+++ b/src/HIndent/Pretty.hs
@@ -979,17 +979,20 @@
 instance Pretty Asst where
   prettyInternal x =
     case x of
-      ClassA _ name types -> spaced (pretty name : map pretty types)
-      i@InfixA {} -> pretty' i
       IParam _ name ty -> do
         pretty name
         write " :: "
         pretty ty
+      ParenA _ asst -> parens (pretty asst)
+#if MIN_VERSION_haskell_src_exts(1,21,0)
+      TypeA _ ty -> pretty ty
+#else
+      ClassA _ name types -> spaced (pretty name : map pretty types)
+      i@InfixA {} -> pretty' i
       EqualP _ a b -> do
         pretty a
         write " ~ "
         pretty b
-      ParenA _ asst -> parens (pretty asst)
       AppA _ name tys ->
         spaced (pretty name : map pretty tys)
       WildCardA _ name ->
@@ -998,6 +1001,7 @@
           Just n -> do
             write "_"
             pretty n
+#endif
 
 instance Pretty BangType where
   prettyInternal x =
diff --git a/src/HIndent/Types.hs b/src/HIndent/Types.hs
--- a/src/HIndent/Types.hs
+++ b/src/HIndent/Types.hs
@@ -1,3 +1,4 @@
+{-# OPTIONS_GHC -cpp #-}
 {-# LANGUAGE RankNTypes #-}
 {-# LANGUAGE OverloadedStrings #-}
 {-# LANGUAGE GADTs #-}
@@ -71,7 +72,12 @@
     }
 
 -- | Parse an extension.
+
+#if __GLASGOW_HASKELL__ >= 808
+readExtension :: (Monad m, MonadFail m) => String -> m Extension
+#else
 readExtension :: Monad m => String -> m Extension
+#endif
 readExtension x =
   case classifyExtension x -- Foo
        of
diff --git a/src/main/Test.hs b/src/main/Test.hs
--- a/src/main/Test.hs
+++ b/src/main/Test.hs
@@ -61,7 +61,7 @@
                 shouldBeReadable (reformat cfg code) (L.fromStrict codeExpect)
               go next'
             _ ->
-              fail
+              error
                 "'haskell given' block must be followed by a 'haskell expect' block"
         "haskell pending" -> do
           it (UTF8.toString desc) pending
