diff --git a/CHANGELOG.md b/CHANGELOG.md
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -1,7 +1,17 @@
 # Changelog
 
-tomland uses [PVP Versioning][1].
+`tomland` uses [PVP Versioning][1].
 The changelog is available [on GitHub][2].
+
+## 1.3.1.0 — Sep 21, 2020
+
+* [#331](https://github.com/kowainik/tomland/issues/331):
+  Support hexidecimal, octal and binary values with underscores.
+* [#335](https://github.com/kowainik/tomland/issues/335):
+  Consider table array keys in `tableMap`s as well.
+* [#338](https://github.com/kowainik/tomland/issues/338):
+  Allow `megaparsec-9.0` and `hspec-megaparsec-2.2`.
+* Update GHC from `8.8.3` to `8.8.4`, from `8.10.1` to `8.10.2`.
 
 ## 1.3.0.0 — May 19, 2020
 
diff --git a/examples/Main.hs b/examples/Main.hs
--- a/examples/Main.hs
+++ b/examples/Main.hs
@@ -108,6 +108,21 @@
     <*> Toml.int "green" .= rgbGreen
     <*> Toml.int "blue"  .= rgbBlue
 
+newtype Inner = Inner
+    { val :: Text
+    } deriving stock (Show)
+
+innerCodec :: TomlCodec Inner
+innerCodec = Inner <$> Toml.text "val" .= val
+
+newtype MapWithList = MapWithList
+    { mapList :: Map Text [Inner]
+    } deriving stock (Show)
+
+mapWithListCodec :: TomlCodec MapWithList
+mapWithListCodec = MapWithList
+    <$> Toml.tableMap Toml._KeyText (Toml.list innerCodec) "mapList" .= mapList
+
 data Test = Test
     { testB      :: !Bool
     , testI      :: !Int
@@ -133,6 +148,7 @@
     , intset     :: !IntSet
     , payloads   :: !(Map Text Int)
     , colours    :: !(Map Text Colour)
+    , tableList  :: !MapWithList
     }
 
 
@@ -162,6 +178,7 @@
     <*> Toml.arrayIntSet "intset" .= intset
     <*> Toml.map (Toml.text "name") (Toml.int "payload") "payloads" .= payloads
     <*> Toml.tableMap Toml._KeyText colourCodec "colours" .= colours
+    <*> mapWithListCodec .= tableList
   where
     pairC :: TomlCodec (Int, Text)
     pairC = Toml.pair (Toml.int "pNum") (Toml.text "pName")
diff --git a/src/Toml/Codec/Combinator/Map.hs b/src/Toml/Codec/Combinator/Map.hs
--- a/src/Toml/Codec/Combinator/Map.hs
+++ b/src/Toml/Codec/Combinator/Map.hs
@@ -374,7 +374,8 @@
     -> Key
     -- ^ Table name for Map
     -> TomlCodec map
-internalTableMap emptyMap toListMap fromListMap keyBiMap valCodec tableName = Codec input output
+internalTableMap emptyMap toListMap fromListMap keyBiMap valCodec tableName =
+    Codec input output
   where
     input :: TomlEnv map
     input = \t -> case Prefix.lookup tableName $ tomlTables t of
@@ -382,7 +383,8 @@
         Just toml ->
             let valKeys = HashMap.keys $ tomlPairs toml
                 tableKeys = fmap (:|| []) $ HashMap.keys $ tomlTables toml
-            in fmap fromListMap $ for (valKeys <> tableKeys) $ \key ->
+                tableArrayKey = HashMap.keys $ tomlTableArrays toml
+            in fmap fromListMap $ for (valKeys <> tableKeys <> tableArrayKey) $ \key ->
                 whenLeftBiMapError key (forward keyBiMap key) $ \k ->
                     (k,) <$> codecRead (valCodec key) toml
 
diff --git a/src/Toml/Parser/Core.hs b/src/Toml/Parser/Core.hs
--- a/src/Toml/Parser/Core.hs
+++ b/src/Toml/Parser/Core.hs
@@ -26,7 +26,7 @@
 
 import Text.Megaparsec (Parsec, anySingle, eof, errorBundlePretty, match, parse, satisfy, try,
                         (<?>))
-import Text.Megaparsec.Char (alphaNumChar, char, digitChar, eol, hexDigitChar, space, space1,
+import Text.Megaparsec.Char (alphaNumChar, char, digitChar, eol, hexDigitChar, octDigitChar, binDigitChar, space, space1,
                              string, tab)
 import Text.Megaparsec.Char.Lexer (binary, float, hexadecimal, octal, signed, skipLineComment,
                                    symbol)
diff --git a/src/Toml/Parser/Value.hs b/src/Toml/Parser/Value.hs
--- a/src/Toml/Parser/Value.hs
+++ b/src/Toml/Parser/Value.hs
@@ -22,9 +22,12 @@
 import Data.Fixed (Pico)
 import Data.Time (Day, LocalTime (..), TimeOfDay, ZonedTime (..), fromGregorianValid,
                   makeTimeOfDayValid, minutesToTimeZone)
+import Data.String (fromString)
+
 import Text.Read (readMaybe)
+import Text.Megaparsec (parseMaybe)
 
-import Toml.Parser.Core (Parser, binary, char, digitChar, hexadecimal, lexeme, octal, sc, signed,
+import Toml.Parser.Core (Parser, char, digitChar, hexDigitChar, octDigitChar, binDigitChar, hexadecimal, octal, binary, lexeme, sc, signed,
                          string, text, try, (<?>))
 import Toml.Parser.String (textP)
 import Toml.Type (AnyValue, UValue (..), typeCheck)
@@ -41,15 +44,33 @@
     check :: Maybe Integer -> Parser Integer
     check = maybe (fail "Not an integer") pure
 
+-- | Parser for hexadecimal, octal and binary numbers : included parsing
+numberP :: Parser Integer -> Parser Char -> String -> Parser Integer
+numberP parseInteger parseDigit errorMessage = more
+  where
+    more :: Parser Integer
+    more = check =<< intValueMaybe . concat <$> sepBy1 (some parseDigit) (char '_')
+
+    intValueMaybe :: String -> Maybe Integer
+    intValueMaybe = parseMaybe parseInteger . fromString
+
+    check :: Maybe Integer -> Parser Integer
+    check = maybe (fail errorMessage) pure
+
+
+
 -- | Parser for 'Integer' value.
 integerP :: Parser Integer
 integerP = lexeme (bin <|> oct <|> hex <|> dec) <?> "integer"
   where
     bin, oct, hex, dec :: Parser Integer
-    bin = try (char '0' *> char 'b') *> binary      <?> "bin"
-    oct = try (char '0' *> char 'o') *> octal       <?> "oct"
-    hex = try (char '0' *> char 'x') *> hexadecimal <?> "hex"
+    bin = try (char '0' *> char 'b') *> binaryP      <?> "bin"
+    oct = try (char '0' *> char 'o') *> octalP       <?> "oct"
+    hex = try (char '0' *> char 'x') *> hexadecimalP <?> "hex"
     dec = signed sc decimalP                        <?> "dec"
+    binaryP = numberP binary binDigitChar "Invalid binary number"
+    octalP  = numberP octal octDigitChar  "Invalid ocatl number"
+    hexadecimalP = numberP hexadecimal hexDigitChar "Invalid hexadecimal number"
 
 -- | Parser for 'Double' value.
 doubleP :: Parser Double
diff --git a/test/Test/Toml/Codec/Combinator/Map.hs b/test/Test/Toml/Codec/Combinator/Map.hs
--- a/test/Test/Toml/Codec/Combinator/Map.hs
+++ b/test/Test/Toml/Codec/Combinator/Map.hs
@@ -2,6 +2,7 @@
     ( mapSpec
     ) where
 
+import Data.Foldable (toList)
 import Test.Hspec (Spec, describe, parallel)
 
 import Test.Toml.Codec.Combinator.Common (codecRoundtrip)
@@ -9,6 +10,7 @@
 
 import qualified Test.Toml.Gen as Gen
 import qualified Toml.Codec.BiMap.Conversion as Toml
+import qualified Toml.Codec.Combinator.List as Toml
 import qualified Toml.Codec.Combinator.Map as Toml
 import qualified Toml.Codec.Combinator.Primitive as Toml
 
@@ -21,3 +23,7 @@
     codecRoundtrip "Map Text Int (tableMap)"
         (Toml.tableMap Toml._KeyText Toml.int)
         (Gen.genMap (prettyKey <$> Gen.genKey) Gen.genInt)
+    -- TODO: handle empty lists in values.
+    codecRoundtrip "Map Text [Int] (tableMap)"
+        (Toml.tableMap Toml._KeyText (Toml.list $ Toml.int "val"))
+        (Gen.genMap (prettyKey <$> Gen.genKey) (toList <$> Gen.genNonEmpty Gen.genInt))
diff --git a/test/Test/Toml/Parser/Common.hs b/test/Test/Toml/Parser/Common.hs
--- a/test/Test/Toml/Parser/Common.hs
+++ b/test/Test/Toml/Parser/Common.hs
@@ -1,3 +1,5 @@
+{-# LANGUAGE CPP #-}
+
 module Test.Toml.Parser.Common
        ( parseX
        , failOn
@@ -40,6 +42,9 @@
 import Test.Hspec (Expectation)
 import Test.Hspec.Megaparsec (shouldFailOn, shouldParse)
 import Text.Megaparsec (Parsec, ShowErrorComponent, Stream, parse)
+#if MIN_VERSION_megaparsec(9,0,0)
+import Text.Megaparsec.Stream (TraversableStream, VisualStream)
+#endif
 
 import Toml.Parser.Item (tomlP)
 import Toml.Parser.Key (keyP)
@@ -52,7 +57,15 @@
 
 
 parseX
-    :: (ShowErrorComponent e, Stream s, Show a, Eq a)
+    :: ( ShowErrorComponent e
+       , Stream s
+#if MIN_VERSION_megaparsec(9,0,0)
+       , VisualStream s
+       , TraversableStream s
+#endif
+       , Show a
+       , Eq a
+       )
     => Parsec e s a -> s -> a -> Expectation
 parseX p given expected = parse p "" given `shouldParse` expected
 
diff --git a/test/Test/Toml/Parser/Integer.hs b/test/Test/Toml/Parser/Integer.hs
--- a/test/Test/Toml/Parser/Integer.hs
+++ b/test/Test/Toml/Parser/Integer.hs
@@ -81,3 +81,41 @@
         it "can parse numbers when hex digits are in both lowercase and uppercase" $ do
             parseInteger "0xAbCdEf" 0xAbCdEf
             parseInteger "0xaBcDeF" 0xaBcDeF
+    context "when there is underscore in hexadecimal, octal and binary representation" $ do
+        it "can parse numbers with underscore in hexadecimal representation" $ do
+            parseInteger "0xAb_Cd_Ef" 0xabcdef
+            parseInteger "0xA_bcd_ef" 0xabcdef
+            parseInteger "0x123_abc" 0x123abc
+            parseInteger "0xa_b_c_1_2_3" 0xabc123
+        it "can't parse when underscore is between hexadecimal prefix and suffix" $ do
+            integerFailOn "0x_Abab_ca"
+            integerFailOn "0x_ababbac"
+        it "can parse numbers with underscore in octal representation" $ do
+            parseInteger "0o12_34_56" 0o123456
+            parseInteger "0o1_2345_6" 0o123456
+            parseInteger "0o76_54_21" 0o765421
+            parseInteger "0o4_5_3_2_6" 0o45326
+        it "can't parse when underscore is between octal prefix and suffix" $ do
+            integerFailOn "0o_123_4567"
+            integerFailOn "0o_1234567"
+        it "can parse numbers with underscore in binary representation" $ do
+            parseInteger "0b10_101_0" 42
+            parseInteger "0b10_10_10" 42
+            parseInteger "0b1_0_1" 5
+            parseInteger "0b1_0" 2
+        it "can't parse numbers when underscore is between binary prefix and suffix" $ do
+            integerFailOn "0b_10101_0"
+            integerFailOn "0b_101010"
+        it "doesn't parse underscore not followed by any numbers" $ do 
+            integerFailOn "0b_"
+            integerFailOn "0o_"
+            integerFailOn "0x_"
+        it "doesn't parse when number is ending with underscore" $ do 
+            integerFailOn "0b101_110_"
+            integerFailOn "0b10101_"
+            integerFailOn "0x1_23_daf_"
+            integerFailOn "0x1214adf_"
+            integerFailOn "0o1_15_41_"
+            integerFailOn "0o1215147_"
+            
+       
diff --git a/tomland.cabal b/tomland.cabal
--- a/tomland.cabal
+++ b/tomland.cabal
@@ -1,6 +1,6 @@
 cabal-version:       2.4
 name:                tomland
-version:             1.3.0.0
+version:             1.3.1.0
 synopsis:            Bidirectional TOML serialization
 description:
     Implementation of bidirectional TOML serialization. Simple codecs look like this:
@@ -36,8 +36,8 @@
                      test/examples/*.toml
 tested-with:         GHC == 8.4.4
                      GHC == 8.6.5
-                     GHC == 8.8.3
-                     GHC == 8.10.1
+                     GHC == 8.8.4
+                     GHC == 8.10.2
 
 source-repository head
   type:                git
@@ -119,7 +119,7 @@
                      , containers >= 0.5.7 && < 0.7
                      , deepseq ^>= 1.4
                      , hashable >= 1.2 && < 1.4
-                     , megaparsec >= 7.0.5 && < 8.1
+                     , megaparsec >= 7.0.5 && < 9.1
                      , mtl ^>= 2.2
                      , parser-combinators >= 1.1.0 && < 1.3
                      , text ^>= 1.2
@@ -215,7 +215,7 @@
                      , hspec ^>= 2.7.1
                      , hspec-hedgehog ^>= 0.0.1
                      , hspec-golden ^>= 0.1.0
-                     , hspec-megaparsec >= 2.0.0 && < 2.2.0
+                     , hspec-megaparsec >= 2.0.0 && < 2.3.0
                      , megaparsec
                      , directory ^>= 1.3
                      , text
