diff --git a/CHANGES.md b/CHANGES.md
--- a/CHANGES.md
+++ b/CHANGES.md
@@ -4,6 +4,15 @@
 -- SPDX-License-Identifier: MPL-2.0
 -->
 
-# 0.1
+# Unreleased
+
+
+# 0.9.1
+
+* Bump upper bound on `base` to <4.17.
+* Fix the issue with interpolator failing with non-exhaustive pattern match on fresh LTS / GHC versions.
+* Avoid creating extra `\r`s at end of line on Windows.
+
+# 0.9
 
 Initial version.
diff --git a/nyan-interpolation-core.cabal b/nyan-interpolation-core.cabal
--- a/nyan-interpolation-core.cabal
+++ b/nyan-interpolation-core.cabal
@@ -1,13 +1,13 @@
 cabal-version: 2.0
 
--- This file has been generated from package.yaml by hpack version 0.33.0.
+-- This file has been generated from package.yaml by hpack version 0.35.0.
 --
 -- see: https://github.com/sol/hpack
 --
--- hash: 4810cd4539501b3d69ccbc22d8a6c24b1545a973c329ab1e27f62cdcb2296dde
+-- hash: 454835beb066a76fcd19ff1540bc89d3e2f2732ac9d7164ec5903d0eb782bebd
 
 name:           nyan-interpolation-core
-version:        0.9.0.1
+version:        0.9.1
 synopsis:       Customize your nyan interpolator!
 description:    This package to tune up your own variation of interpolator. Declare new rendering modes, set desired switches defaults and more.
 category:       Interpolation, Text
@@ -43,10 +43,40 @@
       Paths_nyan_interpolation_core
   hs-source-dirs:
       src
-  default-extensions: AllowAmbiguousTypes BangPatterns BlockArguments ConstraintKinds DataKinds DefaultSignatures DeriveDataTypeable DeriveGeneric DerivingStrategies FlexibleContexts FlexibleInstances FunctionalDependencies GeneralizedNewtypeDeriving LambdaCase MultiParamTypeClasses MultiWayIf NamedFieldPuns OverloadedStrings RankNTypes RecordWildCards ScopedTypeVariables StandaloneDeriving TemplateHaskell TupleSections TypeFamilies UndecidableInstances ViewPatterns TypeApplications TypeOperators QuasiQuotes
+  default-extensions:
+      AllowAmbiguousTypes
+      BangPatterns
+      BlockArguments
+      ConstraintKinds
+      DataKinds
+      DefaultSignatures
+      DeriveDataTypeable
+      DeriveGeneric
+      DerivingStrategies
+      FlexibleContexts
+      FlexibleInstances
+      FunctionalDependencies
+      GeneralizedNewtypeDeriving
+      LambdaCase
+      MultiParamTypeClasses
+      MultiWayIf
+      NamedFieldPuns
+      OverloadedStrings
+      RankNTypes
+      RecordWildCards
+      ScopedTypeVariables
+      StandaloneDeriving
+      TemplateHaskell
+      TupleSections
+      TypeFamilies
+      UndecidableInstances
+      ViewPatterns
+      TypeApplications
+      TypeOperators
+      QuasiQuotes
   ghc-options: -Weverything -Wno-missing-export-lists -Wno-missing-exported-signatures -Wno-missing-import-lists -Wno-missed-specialisations -Wno-all-missed-specialisations -Wno-unsafe -Wno-safe -Wno-missing-local-signatures -Wno-monomorphism-restriction -Wno-implicit-prelude -Wno-prepositive-qualified-module -Wno-missing-safe-haskell-mode -Wno-unused-packages
   build-depends:
-      base <4.15
+      base <4.17
     , fmt
     , megaparsec
     , mtl
@@ -67,15 +97,47 @@
       Test.ValueInterpolators
       Tree
       Paths_nyan_interpolation_core
+  autogen-modules:
+      Paths_nyan_interpolation_core
   hs-source-dirs:
       tests
-  default-extensions: AllowAmbiguousTypes BangPatterns BlockArguments ConstraintKinds DataKinds DefaultSignatures DeriveDataTypeable DeriveGeneric DerivingStrategies FlexibleContexts FlexibleInstances FunctionalDependencies GeneralizedNewtypeDeriving LambdaCase MultiParamTypeClasses MultiWayIf NamedFieldPuns OverloadedStrings RankNTypes RecordWildCards ScopedTypeVariables StandaloneDeriving TemplateHaskell TupleSections TypeFamilies UndecidableInstances ViewPatterns TypeApplications TypeOperators QuasiQuotes
+  default-extensions:
+      AllowAmbiguousTypes
+      BangPatterns
+      BlockArguments
+      ConstraintKinds
+      DataKinds
+      DefaultSignatures
+      DeriveDataTypeable
+      DeriveGeneric
+      DerivingStrategies
+      FlexibleContexts
+      FlexibleInstances
+      FunctionalDependencies
+      GeneralizedNewtypeDeriving
+      LambdaCase
+      MultiParamTypeClasses
+      MultiWayIf
+      NamedFieldPuns
+      OverloadedStrings
+      RankNTypes
+      RecordWildCards
+      ScopedTypeVariables
+      StandaloneDeriving
+      TemplateHaskell
+      TupleSections
+      TypeFamilies
+      UndecidableInstances
+      ViewPatterns
+      TypeApplications
+      TypeOperators
+      QuasiQuotes
   ghc-options: -Weverything -Wno-missing-export-lists -Wno-missing-exported-signatures -Wno-missing-import-lists -Wno-missed-specialisations -Wno-all-missed-specialisations -Wno-unsafe -Wno-safe -Wno-missing-local-signatures -Wno-monomorphism-restriction -Wno-implicit-prelude -Wno-prepositive-qualified-module -Wno-missing-safe-haskell-mode -Wno-unused-packages
   build-tool-depends:
       tasty-discover:tasty-discover
   build-depends:
       HUnit
-    , base <4.15
+    , base <4.17
     , fmt
     , megaparsec
     , mtl
diff --git a/src/Text/Interpolation/Nyan/Core.hs b/src/Text/Interpolation/Nyan/Core.hs
--- a/src/Text/Interpolation/Nyan/Core.hs
+++ b/src/Text/Interpolation/Nyan/Core.hs
@@ -74,7 +74,7 @@
   { TH.quoteExp = \s -> do
       (sopts, sint) <-
         either fail pure $
-        parseIntString (defaultSwitchesOptions iopts) (T.pack s)
+        parseIntString (defaultSwitchesOptions iopts) (useUnixLineEndings $ T.pack s)
       let sint' = processIntString sopts sint
       intSplice iopts (sopts, sint')
   , TH.quotePat = \_ ->
@@ -84,6 +84,11 @@
   , TH.quoteDec = \_ ->
       fail "Cannot interpolate at declaration position"
   }
+  where
+    -- as in https://github.com/serokell/nyan-interpolation/issues/21,
+    -- we should use LF line endings even when source file has CRLF
+    useUnixLineEndings :: T.Text -> T.Text
+    useUnixLineEndings = T.replace "\r\n" "\n"
 
 -- | The most interpolator options.
 --
diff --git a/src/Text/Interpolation/Nyan/Core/Internal/Parser.hs b/src/Text/Interpolation/Nyan/Core/Internal/Parser.hs
--- a/src/Text/Interpolation/Nyan/Core/Internal/Parser.hs
+++ b/src/Text/Interpolation/Nyan/Core/Internal/Parser.hs
@@ -4,7 +4,7 @@
 
 module Text.Interpolation.Nyan.Core.Internal.Parser where
 
-import Control.Applicative (many, optional)
+import Control.Applicative (many)
 import Control.Monad (guard, when, (<=<))
 import Control.Monad.State (MonadState, execStateT, get, put)
 import Data.Bifunctor (first)
@@ -304,11 +304,9 @@
 
   ]
   where
-    newline = PipNewline . mconcat <$> sequence
-      [ maybe "" T.singleton <$> optional (single '\r')
-      , T.singleton <$> single '\n'
-      ]
-    isNonNewlineSpace c = isSpace c && c /= '\n' && c /= '\r'
+    newline = PipNewline . T.singleton <$> single '\n'
+
+    isNonNewlineSpace c = isSpace c && c /= '\n'
 
     -- Parse indentation
     lineStart = asum
diff --git a/src/Text/Interpolation/Nyan/Core/Internal/Splice.hs b/src/Text/Interpolation/Nyan/Core/Internal/Splice.hs
--- a/src/Text/Interpolation/Nyan/Core/Internal/Splice.hs
+++ b/src/Text/Interpolation/Nyan/Core/Internal/Splice.hs
@@ -17,9 +17,6 @@
 import Text.Interpolation.Nyan.Core.Internal.Base
 import Text.Interpolation.Nyan.Core.Internal.RMode
 
--- | Expression result of which can yet be somehow extended.
-type ExtendableRes = (ExpQ -> ExpQ) -> ExpQ
-
 -- | Build interpolated string into TH splice.
 
 -- Note: one of things we aim at is concise produced code, as the user may
@@ -162,10 +159,6 @@
     go = \case
       ' ' : s ->
         '·' : go s
-      '\r' : '\n' : s ->
-        '⤶' : '\r' : '\n' : go s
-      '\r' : s      ->
-        '⤶' : '\r' : go s
       '\n' : s        ->
         '⤶' : '\n' : go s
 
diff --git a/src/Text/Interpolation/Nyan/RModes/CommonExtra.hs b/src/Text/Interpolation/Nyan/RModes/CommonExtra.hs
--- a/src/Text/Interpolation/Nyan/RModes/CommonExtra.hs
+++ b/src/Text/Interpolation/Nyan/RModes/CommonExtra.hs
@@ -5,8 +5,9 @@
 -- | Common additional rendering modes like the ones for numbers.
 module Text.Interpolation.Nyan.RModes.CommonExtra where
 
-import Fmt (Builder)
+import Fmt (Builder, build)
 
+import Control.Exception (Exception (..))
 import Text.Interpolation.Nyan.Core
 import Text.Interpolation.Nyan.RModes.Buildable (rmode')
 
@@ -30,3 +31,9 @@
 -- Alias for 'rmode'd'.
 rmode'n :: RMode Integer
 rmode'n = rmode'd
+
+-- * Exceptions
+
+-- | Render exception via 'displayException'.
+rmode'exc :: Exception e => RMode e
+rmode'exc = RMode (build . displayException)
diff --git a/tests/Test/Interpolator.hs b/tests/Test/Interpolator.hs
--- a/tests/Test/Interpolator.hs
+++ b/tests/Test/Interpolator.hs
@@ -5,6 +5,7 @@
 -- | Tests on the interpolator in overall.
 module Test.Interpolator where
 
+import Control.Exception (AsyncException (ThreadKilled))
 import Control.Monad.Reader (ask, runReader)
 import Data.Functor.Identity (Identity (..))
 import Data.Text (Text)
@@ -59,18 +60,6 @@
         [int|t|Values: {#{a}, #{b}} and #{c}|]
           @?= "Values: {X, Y} and Z"
 
-    , testCase "Rendering modes" do
-        let a = PrintedValue 1
-        let n = 5
-        let s = "string"
-        [int|t|#{a}, #s{a}, #d{n}, #l{s}|]
-          @?= "v = 1, PrintedValue 1, 5, string"
-
-    , testCase "Locally defined rendering mode" do
-        let s = "nyan"
-        [int|t|#mega{s}|]
-          @?= "mega nyan"
-
     , testCase "Spaces in {}" do
         let a = 5
         let s = "string"
@@ -78,6 +67,25 @@
           @?= "5, string"
 
     ]
+
+    , testGroup "Rendering modes"
+      [ testCase "Basic" do
+          let a = PrintedValue 1
+          let n = 5
+          let s = "string"
+          [int|t|#{a}, #s{a}, #d{n}, #l{s}|]
+            @?= "v = 1, PrintedValue 1, 5, string"
+
+      , testCase "Locally defined rendering mode" do
+          let s = "nyan"
+          [int|t|#mega{s}|]
+            @?= "mega nyan"
+
+      , testCase "Exception" do
+          let err = ThreadKilled
+          [int|t|Failed with: #exc{err}|]
+            @?= "Failed with: thread killed"
+      ]
 
     , testGroup "Escaping"
       [ testCase "Newline" do
