diff --git a/CHANGELOG.md b/CHANGELOG.md
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -2,6 +2,10 @@
 
 ## HEAD
 
+## 0.3.0.1
+
+- Make tag and attribute matching case-insensitive.
+
 ## 0.3.0
 
 - Added benchmarks and many optimizations.
diff --git a/scalpel.cabal b/scalpel.cabal
--- a/scalpel.cabal
+++ b/scalpel.cabal
@@ -1,5 +1,5 @@
 name:                scalpel
-version:             0.3.0
+version:             0.3.0.1
 synopsis:            A high level web scraping library for Haskell.
 description:
     Scalpel is a web scraping library inspired by libraries like Parsec and
@@ -24,7 +24,7 @@
 source-repository this
   type:     git
   location: https://github.com/fimad/scalpel.git
-  tag:      v0.3.0
+  tag:      v0.3.0.1
 
 library
   other-extensions:
@@ -60,6 +60,7 @@
   type:             exitcode-stdio-1.0
   main-is:          TestMain.hs
   hs-source-dirs:   tests/
+  default-language: Haskell2010
   build-depends:
           HUnit
       ,   base          >= 4.6 && < 5
diff --git a/src/Text/HTML/Scalpel/Internal/Scrape.hs b/src/Text/HTML/Scalpel/Internal/Scrape.hs
--- a/src/Text/HTML/Scalpel/Internal/Scrape.hs
+++ b/src/Text/HTML/Scalpel/Internal/Scrape.hs
@@ -59,7 +59,7 @@
 -- 'TagSoup.Tag's and produces an optional value.
 scrape :: (Ord str, TagSoup.StringLike str)
        => Scraper str a -> [TagSoup.Tag str] -> Maybe a
-scrape s = scrapeOffsets s . tagWithOffset
+scrape s = scrapeOffsets s . tagWithOffset . TagSoup.canonicalizeTags
 
 -- | The 'chroot' function takes a selector and an inner scraper and executes
 -- the inner scraper as if it were scraping a document that consists solely of
diff --git a/src/Text/HTML/Scalpel/Internal/Select/Types.hs b/src/Text/HTML/Scalpel/Internal/Select/Types.hs
--- a/src/Text/HTML/Scalpel/Internal/Select/Types.hs
+++ b/src/Text/HTML/Scalpel/Internal/Select/Types.hs
@@ -14,6 +14,8 @@
 ,   SelectNode (..)
 ) where
 
+import Data.Char (toLower)
+
 import qualified Text.HTML.TagSoup as TagSoup
 import qualified Text.StringLike as TagSoup
 
@@ -68,7 +70,7 @@
     toSelector = id
 
 instance Selectable String where
-    toSelector node = MkSelector [SelectNode node []]
+    toSelector node = MkSelector [SelectNode (map toLower node) []]
 
 instance Selectable Any where
     toSelector = const (MkSelector [SelectAny []])
@@ -77,10 +79,10 @@
     matchKey = const . const True
 
 instance AttributeName String where
-    matchKey = (==) . TagSoup.fromString
+    matchKey = (==) . TagSoup.fromString . map toLower
 
 instance TagName Any where
     toSelectNode = const SelectAny
 
 instance TagName String where
-    toSelectNode = SelectNode . TagSoup.fromString
+    toSelectNode = SelectNode . TagSoup.fromString . map toLower
diff --git a/tests/TestMain.hs b/tests/TestMain.hs
--- a/tests/TestMain.hs
+++ b/tests/TestMain.hs
@@ -158,6 +158,26 @@
     ,   scrapeTest "<img src='foobar'>" (Just "foobar") (attr "src" "img")
 
     ,   scrapeTest "<img src='foobar' />" (Just "foobar") (attr "src" "img")
+
+    ,   scrapeTest
+            "<a>foo</a><A>bar</A>"
+            (Just ["foo", "bar"])
+            (texts "a")
+
+    ,   scrapeTest
+            "<a>foo</a><A>bar</A>"
+            (Just ["foo", "bar"])
+            (texts "A")
+
+    ,   scrapeTest
+            "<a B=C>foo</a>"
+            (Just ["foo"])
+            (texts $ "A" @: ["b" @= "C"])
+
+    ,   scrapeTest
+            "<a B=C>foo</a>"
+            Nothing
+            (texts $ "A" @: ["b" @= "c"])
     ]
 
 scrapeTest :: (Eq a, Show a) => String -> Maybe a -> Scraper String a -> Test
