diff --git a/CHANGELOG.markdown b/CHANGELOG.markdown
--- a/CHANGELOG.markdown
+++ b/CHANGELOG.markdown
@@ -1,3 +1,8 @@
+0.8.2
+------
+* added a flag allowing to use `microlens` instead of `lens`
+ (thanks to Samuel Balco <goodlyrottenapple@gmail.com>)
+
 0.8.1
 ------
 * compatibility with smallcheck-1.2.0
diff --git a/src/Codec/Xlsx/Formatted.hs b/src/Codec/Xlsx/Formatted.hs
--- a/src/Codec/Xlsx/Formatted.hs
+++ b/src/Codec/Xlsx/Formatted.hs
@@ -1,4 +1,5 @@
 -- | Higher level interface for creating styled worksheets
+{-# LANGUAGE CPP      #-}
 {-# LANGUAGE RankNTypes      #-}
 {-# LANGUAGE RecordWildCards #-}
 {-# LANGUAGE TemplateHaskell #-}
@@ -34,7 +35,14 @@
   , condfmtStopIfTrue
   ) where
 
+#ifdef USE_MICROLENS
+import Lens.Micro
+import Lens.Micro.Mtl
+import Lens.Micro.TH
+import Lens.Micro.GHC ()
+#else
 import Control.Lens
+#endif
 import Control.Monad.State hiding (forM_, mapM)
 import Data.Default
 import Data.Foldable (asum, forM_)
diff --git a/src/Codec/Xlsx/Lens.hs b/src/Codec/Xlsx/Lens.hs
--- a/src/Codec/Xlsx/Lens.hs
+++ b/src/Codec/Xlsx/Lens.hs
@@ -1,9 +1,9 @@
+{-# LANGUAGE CPP   #-}
 {-# LANGUAGE RankNTypes   #-}
 {-# LANGUAGE TypeFamilies #-}
 {-# LANGUAGE DeriveGeneric #-}
 
 -- | lenses to access sheets, cells and values of 'Xlsx'
-
 module Codec.Xlsx.Lens
   ( ixSheet
   , atSheet
@@ -19,7 +19,13 @@
   ) where
 
 import Codec.Xlsx.Types
+#ifdef USE_MICROLENS
+import Lens.Micro
+import Lens.Micro.Internal
+import Lens.Micro.GHC ()
+#else
 import Control.Lens
+#endif
 import Data.Function (on)
 import Data.List (deleteBy)
 import Data.Text
@@ -53,20 +59,17 @@
     then (k,v):r
     else (k1,v1):upsert k v r
 
-sheetList :: Iso' [(Text, Worksheet)] SheetList
-sheetList = iso SheetList unSheetList
-
 -- | lens giving access to a worksheet from 'Xlsx' object
 -- by its name
 ixSheet :: Text -> Traversal' Xlsx Worksheet
-ixSheet s = xlSheets . sheetList . ix s
+ixSheet s = xlSheets . \f -> fmap unSheetList . ix s f . SheetList
 
 -- | 'Control.Lens.At' variant of 'ixSheet' lens
 --
 -- /Note:/ if there is no such sheet in this workbook then new sheet will be
 -- added as the last one to the sheet list
 atSheet :: Text -> Lens' Xlsx (Maybe Worksheet)
-atSheet s = xlSheets . sheetList . at s
+atSheet s = xlSheets . \f -> fmap unSheetList . at s f . SheetList
 
 -- | lens giving access to a cell in some worksheet
 -- by its position, by default row+column index is used
diff --git a/src/Codec/Xlsx/Parser.hs b/src/Codec/Xlsx/Parser.hs
--- a/src/Codec/Xlsx/Parser.hs
+++ b/src/Codec/Xlsx/Parser.hs
@@ -1,3 +1,4 @@
+{-# LANGUAGE CPP #-}
 {-# LANGUAGE DeriveGeneric #-}
 {-# LANGUAGE NoMonomorphismRestriction #-}
 {-# LANGUAGE OverloadedStrings         #-}
@@ -21,7 +22,11 @@
 import Control.Error.Safe (headErr)
 import Control.Error.Util (note)
 import Control.Exception (Exception)
+#ifdef USE_MICROLENS
+import Lens.Micro
+#else
 import Control.Lens hiding ((<.>), element, views)
+#endif
 import Control.Monad (forM, join, void)
 import Control.Monad.Except (catchError, throwError)
 import Data.Bool (bool)
diff --git a/src/Codec/Xlsx/Types.hs b/src/Codec/Xlsx/Types.hs
--- a/src/Codec/Xlsx/Types.hs
+++ b/src/Codec/Xlsx/Types.hs
@@ -1,3 +1,4 @@
+{-# LANGUAGE CPP #-}
 {-# LANGUAGE NoMonomorphismRestriction #-}
 {-# LANGUAGE OverloadedStrings #-}
 {-# LANGUAGE RecordWildCards #-}
@@ -61,7 +62,11 @@
     ) where
 
 import Control.Exception (SomeException, toException)
+#ifdef USE_MICROLENS
+import Lens.Micro.TH
+#else
 import Control.Lens.TH
+#endif
 import Control.DeepSeq (NFData)
 import qualified Data.ByteString.Lazy as L
 import Data.Default
@@ -265,8 +270,7 @@
     def = DefinedNames []
 
 emptyStyles :: Styles
-emptyStyles = Styles "<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"yes\"?>\
-\<styleSheet xmlns=\"http://schemas.openxmlformats.org/spreadsheetml/2006/main\"></styleSheet>"
+emptyStyles = Styles "<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"yes\"?><styleSheet xmlns=\"http://schemas.openxmlformats.org/spreadsheetml/2006/main\"></styleSheet>"
 
 -- | Render 'StyleSheet'
 --
diff --git a/src/Codec/Xlsx/Types/AutoFilter.hs b/src/Codec/Xlsx/Types/AutoFilter.hs
--- a/src/Codec/Xlsx/Types/AutoFilter.hs
+++ b/src/Codec/Xlsx/Types/AutoFilter.hs
@@ -1,3 +1,4 @@
+{-# LANGUAGE CPP #-}
 {-# LANGUAGE FlexibleInstances #-}
 {-# LANGUAGE OverloadedStrings #-}
 {-# LANGUAGE RecordWildCards #-}
@@ -8,7 +9,11 @@
 
 import Control.Arrow (first)
 import Control.DeepSeq (NFData)
+#ifdef USE_MICROLENS
+import Lens.Micro.TH (makeLenses)
+#else
 import Control.Lens (makeLenses)
+#endif
 import Data.Bool (bool)
 import Data.ByteString (ByteString)
 import Data.Default
diff --git a/src/Codec/Xlsx/Types/Cell.hs b/src/Codec/Xlsx/Types/Cell.hs
--- a/src/Codec/Xlsx/Types/Cell.hs
+++ b/src/Codec/Xlsx/Types/Cell.hs
@@ -1,3 +1,4 @@
+{-# LANGUAGE CPP #-}
 {-# LANGUAGE OverloadedStrings #-}
 {-# LANGUAGE RecordWildCards #-}
 {-# LANGUAGE TemplateHaskell #-}
@@ -20,7 +21,11 @@
   ) where
 
 import Control.Arrow (first)
+#ifdef USE_MICROLENS
+import Lens.Micro.TH (makeLenses)
+#else
 import Control.Lens.TH (makeLenses)
+#endif
 import Control.DeepSeq (NFData)
 import Data.Default
 import Data.Map (Map)
diff --git a/src/Codec/Xlsx/Types/ConditionalFormatting.hs b/src/Codec/Xlsx/Types/ConditionalFormatting.hs
--- a/src/Codec/Xlsx/Types/ConditionalFormatting.hs
+++ b/src/Codec/Xlsx/Types/ConditionalFormatting.hs
@@ -1,3 +1,4 @@
+{-# LANGUAGE CPP #-}
 {-# LANGUAGE DeriveGeneric #-}
 {-# LANGUAGE OverloadedStrings #-}
 {-# LANGUAGE RecordWildCards #-}
@@ -42,7 +43,11 @@
 
 import Control.Arrow (first, right)
 import Control.DeepSeq (NFData)
+#ifdef USE_MICROLENS
+import Lens.Micro.TH (makeLenses)
+#else
 import Control.Lens (makeLenses)
+#endif
 import Data.Bool (bool)
 import Data.ByteString (ByteString)
 import Data.Default
diff --git a/src/Codec/Xlsx/Types/DataValidation.hs b/src/Codec/Xlsx/Types/DataValidation.hs
--- a/src/Codec/Xlsx/Types/DataValidation.hs
+++ b/src/Codec/Xlsx/Types/DataValidation.hs
@@ -1,3 +1,4 @@
+{-# LANGUAGE CPP #-}
 {-# LANGUAGE DeriveGeneric #-}
 {-# LANGUAGE MultiParamTypeClasses #-}
 {-# LANGUAGE OverloadedStrings #-}
@@ -6,7 +7,11 @@
 module Codec.Xlsx.Types.DataValidation where
 
 import Control.DeepSeq (NFData)
+#ifdef USE_MICROLENS
+import Lens.Micro.TH (makeLenses)
+#else
 import Control.Lens.TH (makeLenses)
+#endif
 import Control.Monad ((>=>))
 import Data.ByteString (ByteString)
 import Data.Char (isSpace)
diff --git a/src/Codec/Xlsx/Types/Drawing.hs b/src/Codec/Xlsx/Types/Drawing.hs
--- a/src/Codec/Xlsx/Types/Drawing.hs
+++ b/src/Codec/Xlsx/Types/Drawing.hs
@@ -1,3 +1,4 @@
+{-# LANGUAGE CPP #-}
 {-# LANGUAGE DataKinds #-}
 {-# LANGUAGE FlexibleInstances #-}
 {-# LANGUAGE OverloadedStrings #-}
@@ -12,7 +13,11 @@
 
 import Control.Arrow (first)
 import Control.DeepSeq (NFData)
+#ifdef USE_MICROLENS
+import Lens.Micro.TH (makeLenses)
+#else
 import Control.Lens.TH
+#endif
 import Data.ByteString.Lazy (ByteString)
 import Data.Default
 import qualified Data.Map as M
diff --git a/src/Codec/Xlsx/Types/Drawing/Chart.hs b/src/Codec/Xlsx/Types/Drawing/Chart.hs
--- a/src/Codec/Xlsx/Types/Drawing/Chart.hs
+++ b/src/Codec/Xlsx/Types/Drawing/Chart.hs
@@ -1,3 +1,4 @@
+{-# LANGUAGE CPP #-}
 {-# LANGUAGE OverloadedStrings #-}
 {-# LANGUAGE RecordWildCards #-}
 {-# LANGUAGE TemplateHaskell #-}
@@ -6,7 +7,11 @@
 
 import GHC.Generics (Generic)
 
+#ifdef USE_MICROLENS
+import Lens.Micro.TH (makeLenses)
+#else
 import Control.Lens.TH
+#endif
 import Control.DeepSeq (NFData)
 import Data.Default
 import Data.Maybe (catMaybes, listToMaybe, maybeToList)
diff --git a/src/Codec/Xlsx/Types/Drawing/Common.hs b/src/Codec/Xlsx/Types/Drawing/Common.hs
--- a/src/Codec/Xlsx/Types/Drawing/Common.hs
+++ b/src/Codec/Xlsx/Types/Drawing/Common.hs
@@ -1,3 +1,4 @@
+{-# LANGUAGE CPP #-}
 {-# LANGUAGE OverloadedStrings #-}
 {-# LANGUAGE RecordWildCards #-}
 {-# LANGUAGE TemplateHaskell #-}
@@ -7,7 +8,11 @@
 import GHC.Generics (Generic)
 
 import Control.Arrow (first)
+#ifdef USE_MICROLENS
+import Lens.Micro.TH (makeLenses)
+#else
 import Control.Lens.TH
+#endif
 import Control.Monad (join)
 import Control.Monad.Fail (MonadFail)
 import Control.DeepSeq (NFData)
diff --git a/src/Codec/Xlsx/Types/PageSetup.hs b/src/Codec/Xlsx/Types/PageSetup.hs
--- a/src/Codec/Xlsx/Types/PageSetup.hs
+++ b/src/Codec/Xlsx/Types/PageSetup.hs
@@ -1,3 +1,4 @@
+{-# LANGUAGE CPP #-}
 {-# LANGUAGE OverloadedStrings #-}
 {-# LANGUAGE TemplateHaskell   #-}
 {-# LANGUAGE RecordWildCards   #-}
@@ -34,7 +35,11 @@
   , pageSetupVerticalDpi
   ) where
 
+#ifdef USE_MICROLENS
+import Lens.Micro.TH (makeLenses)
+#else
 import Control.Lens (makeLenses)
+#endif
 import Control.DeepSeq (NFData)
 import Data.Default
 import qualified Data.Map as Map
diff --git a/src/Codec/Xlsx/Types/Protection.hs b/src/Codec/Xlsx/Types/Protection.hs
--- a/src/Codec/Xlsx/Types/Protection.hs
+++ b/src/Codec/Xlsx/Types/Protection.hs
@@ -1,3 +1,4 @@
+{-# LANGUAGE CPP #-}
 {-# LANGUAGE OverloadedStrings #-}
 {-# LANGUAGE RecordWildCards #-}
 {-# LANGUAGE TemplateHaskell #-}
@@ -31,7 +32,11 @@
 import GHC.Generics (Generic)
 
 import Control.Arrow (first)
+#ifdef USE_MICROLENS
+import Lens.Micro.TH (makeLenses)
+#else
 import Control.Lens (makeLenses)
+#endif
 import Control.DeepSeq (NFData)
 import Data.Bits
 import Data.Char
diff --git a/src/Codec/Xlsx/Types/RichText.hs b/src/Codec/Xlsx/Types/RichText.hs
--- a/src/Codec/Xlsx/Types/RichText.hs
+++ b/src/Codec/Xlsx/Types/RichText.hs
@@ -32,7 +32,11 @@
 
 import GHC.Generics (Generic)
 
+#ifdef USE_MICROLENS
+import Lens.Micro.TH (makeLenses)
+#else
 import Control.Lens hiding (element)
+#endif
 import Control.Monad
 import Control.DeepSeq (NFData)
 import Data.Default
diff --git a/src/Codec/Xlsx/Types/SheetViews.hs b/src/Codec/Xlsx/Types/SheetViews.hs
--- a/src/Codec/Xlsx/Types/SheetViews.hs
+++ b/src/Codec/Xlsx/Types/SheetViews.hs
@@ -1,3 +1,4 @@
+{-# LANGUAGE CPP #-}
 {-# LANGUAGE OverloadedStrings #-}
 {-# LANGUAGE RecordWildCards   #-}
 {-# LANGUAGE TemplateHaskell   #-}
@@ -48,7 +49,11 @@
 
 import GHC.Generics (Generic)
 
+#ifdef USE_MICROLENS
+import Lens.Micro.TH (makeLenses)
+#else
 import Control.Lens (makeLenses)
+#endif
 import Control.DeepSeq (NFData)
 import Data.Default
 import Data.Maybe (catMaybes, maybeToList, listToMaybe)
diff --git a/src/Codec/Xlsx/Types/StyleSheet.hs b/src/Codec/Xlsx/Types/StyleSheet.hs
--- a/src/Codec/Xlsx/Types/StyleSheet.hs
+++ b/src/Codec/Xlsx/Types/StyleSheet.hs
@@ -1,3 +1,4 @@
+{-# LANGUAGE CPP #-}
 {-# LANGUAGE OverloadedStrings #-}
 {-# LANGUAGE RecordWildCards   #-}
 {-# LANGUAGE TemplateHaskell   #-}
@@ -128,7 +129,12 @@
   , firstUserNumFmtId
   ) where
 
+#ifdef USE_MICROLENS
+import Lens.Micro
+import Lens.Micro.TH (makeLenses)
+#else
 import Control.Lens hiding (element, elements, (.=))
+#endif
 import Control.DeepSeq (NFData)
 import Data.Default
 import Data.Map.Strict (Map)
diff --git a/src/Codec/Xlsx/Types/Table.hs b/src/Codec/Xlsx/Types/Table.hs
--- a/src/Codec/Xlsx/Types/Table.hs
+++ b/src/Codec/Xlsx/Types/Table.hs
@@ -1,10 +1,15 @@
+{-# LANGUAGE CPP #-}
 {-# LANGUAGE OverloadedStrings #-}
 {-# LANGUAGE RecordWildCards #-}
 {-# LANGUAGE TemplateHaskell #-}
 {-# LANGUAGE DeriveGeneric #-}
 module Codec.Xlsx.Types.Table where
 
+#ifdef USE_MICROLENS
+import Lens.Micro.TH (makeLenses)
+#else
 import Control.Lens (makeLenses)
+#endif
 import Control.DeepSeq (NFData)
 import Data.Maybe (catMaybes, maybeToList)
 import Data.Text (Text)
diff --git a/src/Codec/Xlsx/Writer.hs b/src/Codec/Xlsx/Writer.hs
--- a/src/Codec/Xlsx/Writer.hs
+++ b/src/Codec/Xlsx/Writer.hs
@@ -1,3 +1,4 @@
+{-# LANGUAGE CPP #-}
 {-# LANGUAGE FlexibleContexts #-}
 {-# LANGUAGE OverloadedStrings #-}
 {-# LANGUAGE RecordWildCards #-}
@@ -10,7 +11,11 @@
 
 import qualified Codec.Archive.Zip as Zip
 import Control.Arrow (second)
+#ifdef USE_MICROLENS
+import Lens.Micro
+#else
 import Control.Lens hiding (transform, (.=))
+#endif
 import Control.Monad (forM)
 import Control.Monad.ST
 import Control.Monad.State (evalState, get, put)
diff --git a/xlsx.cabal b/xlsx.cabal
--- a/xlsx.cabal
+++ b/xlsx.cabal
@@ -1,6 +1,6 @@
 Name:                xlsx
 
-Version:             0.8.1
+Version:             0.8.2
 
 Synopsis:            Simple and incomplete Excel file parser/writer
 Description:
@@ -29,7 +29,11 @@
 Tested-with:         GHC == 8.0.2, GHC == 8.2.2, GHC == 8.4.3, GHC == 8.6.5, GHC == 8.8.1
 Cabal-version:       >=1.10
 
+Flag microlens
+  default: False
+  description: Use microlens instead of lens
 
+
 Library
   Hs-source-dirs:    src
   ghc-options:       -Wall
@@ -85,7 +89,6 @@
                    , errors
                    , extra
                    , filepath
-                   , lens         >= 3.8 && < 5
                    , mtl          >= 2.1
                    , network-uri
                    , old-locale   >= 1.0.0.5
@@ -98,6 +101,15 @@
                    , xml-conduit  >= 1.1.0
                    , zip-archive  >= 0.2
                    , zlib         >= 0.5.4.0
+  if flag(microlens)
+    Build-depends:     microlens    >= 0.4 && < 0.5
+                     , microlens-mtl
+                     , microlens-ghc
+                     , microlens-th
+    cpp-options: -DUSE_MICROLENS
+  else
+    Build-depends:     lens         >= 3.8 && < 5
+
   Default-Language:     Haskell2010
   Other-Extensions:  DeriveDataTypeable
                      FlexibleInstances
@@ -125,7 +137,7 @@
                , containers
                , Diff >= 0.3.0
                , groom
-               , lens
+               , lens >= 3.8 && < 5
                , mtl
                , raw-strings-qq
                , smallcheck
