diff --git a/.analysis_options b/.analysis_options
new file mode 100644
index 0000000..a10d4c5
--- /dev/null
+++ b/.analysis_options
@@ -0,0 +1,2 @@
+analyzer:
+  strong-mode: true
diff --git a/CHANGELOG.md b/CHANGELOG.md
index b4ee9e1..7133be0 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -1,3 +1,11 @@
+## 0.13.0
+
+ * **BREAKING** Fix all [strong mode][] errors and warnings.
+   This involved adding more precise on some public APIs, which
+   is why it may break users.
+ 
+[strong mode]: https://github.com/dart-lang/dev_compiler/blob/master/STRONG_MODE.md
+
 ## 0.12.2
 
  * Fix to handle calc functions however, the expressions are treated as a
diff --git a/example/call_parser.dart b/example/call_parser.dart
index 7179a17..3ae5889 100644
--- a/example/call_parser.dart
+++ b/example/call_parser.dart
@@ -2,6 +2,7 @@
 // for details. All rights reserved. Use of this source code is governed by a
 
 import 'package:csslib/parser.dart' as css;
+import 'package:csslib/src/messages.dart';
 import 'package:csslib/visitor.dart';
 
 const _default = const css.PreprocessorOptions(
@@ -16,7 +17,7 @@
  * tests (by default) will ensure that the CSS is really valid.
  */
 StyleSheet parseCss(String cssInput,
-    {List errors, css.PreprocessorOptions opts}) {
+    {List<Message> errors, css.PreprocessorOptions opts}) {
   return css.parse(cssInput,
       errors: errors, options: opts == null ? _default : opts);
 }
@@ -27,7 +28,7 @@
     (emitCss..visitTree(ss, pretty: true)).toString();
 
 main() {
-  var errors = [];
+  var errors = <Message>[];
 
   // Parse a simple stylesheet.
   print('1. Good CSS, parsed CSS emitted:');
diff --git a/lib/parser.dart b/lib/parser.dart
index b3a22d6..12c9d21 100644
--- a/lib/parser.dart
+++ b/lib/parser.dart
@@ -356,7 +356,7 @@
    *    : IDENT
    */
   List<MediaQuery> processMediaQueryList() {
-    var mediaQueries = [];
+    var mediaQueries = <MediaQuery>[];
 
     bool firstTime = true;
     var mediaQuery;
@@ -409,7 +409,7 @@
       if (_peekIdentifier()) type = identifier();
     }
 
-    var exprs = [];
+    var exprs = <MediaExpression>[];
 
     if (unaryOp == -1 || unaryOp == TokenKind.MEDIA_OP_AND) {
       var andOp = false;
@@ -775,7 +775,7 @@
 
     var name = identifier();
 
-    List<VarDefinitionDirective> params = [];
+    var params = <VarDefinition>[];
     // Any parameters?
     if (_maybeEat(TokenKind.LPAREN)) {
       var mustHaveParam = false;
@@ -813,7 +813,7 @@
       if (declGroup.declarations.any((decl) {
         return decl is Declaration && decl is! IncludeMixinAtDeclaration;
       })) {
-        var newDecls = [];
+        var newDecls = <Declaration>[];
         productions.forEach((include) {
           // If declGroup has items that are declarations then we assume
           // this mixin is a declaration mixin not a top-level mixin.
@@ -943,7 +943,7 @@
       name = identifier();
     }
 
-    var params = [];
+    var params = <List<Expression>>[];
 
     // Any parameters?  Parameters can be multiple terms per argument e.g.,
     // 3px solid yellow, green is two parameters:
@@ -951,7 +951,7 @@
     //    2. green
     // the first has 3 terms and the second has 1 term.
     if (_maybeEat(TokenKind.LPAREN)) {
-      var terms = [];
+      var terms = <Expression>[];
       var expr;
       var keepGoing = true;
       while (keepGoing && (expr = processTerm()) != null) {
@@ -1041,8 +1041,8 @@
 
     if (checkBrace) _eat(TokenKind.LBRACE);
 
-    List decls = [];
-    List dartStyles = []; // List of latest styles exposed to Dart.
+    var decls = <TreeNode>[];
+    var dartStyles = []; // List of latest styles exposed to Dart.
 
     do {
       var selectorGroup = _nestedSelector();
@@ -1093,7 +1093,7 @@
   }
 
   List<DeclarationGroup> processMarginsDeclarations() {
-    List groups = [];
+    var groups = <DeclarationGroup>[];
 
     var start = _peekToken.span;
 
@@ -1487,7 +1487,7 @@
   processSelectorExpression() {
     var start = _peekToken.span;
 
-    var expressions = [];
+    var expressions = <Expression>[];
 
     Token termToken;
     var value;
@@ -2269,7 +2269,8 @@
           }
 
           var param = expr.expressions[0];
-          var varUsage = new VarUsage(param.text, [], _makeSpan(start));
+          var varUsage = new VarUsage(
+              (param as LiteralTerm).text, [], _makeSpan(start));
           expr.expressions[0] = varUsage;
           return expr.expressions;
         }
@@ -2543,11 +2544,11 @@
           _error("too many parameters to var()", _peekToken.span);
         }
 
-        var paramName = expr.expressions[0].text;
+        var paramName = (expr.expressions[0] as LiteralTerm).text;
 
         // [0] - var name, [1] - OperatorComma, [2] - default value.
-        var defaultValues =
-            expr.expressions.length >= 3 ? expr.expressions.sublist(2) : [];
+        var defaultValues = expr.expressions.length >= 3
+            ? expr.expressions.sublist(2) : <Expression>[];
         return new VarUsage(paramName, defaultValues, _makeSpan(start));
       default:
         var expr = processExpr();
diff --git a/lib/src/analyzer.dart b/lib/src/analyzer.dart
index fc27ceb..4d3e3c8 100644
--- a/lib/src/analyzer.dart
+++ b/lib/src/analyzer.dart
@@ -243,7 +243,7 @@
     var selectors = node.selectorGroup.selectors;
 
     // Create a merged set of previous parent selectors and current selectors.
-    var newSelectors = [];
+    var newSelectors = <Selector>[];
     for (Selector selector in selectors) {
       for (Selector nestedSelector in nestedSelectors) {
         var seq = _mergeNestedSelector(nestedSelector.simpleSelectorSequences,
@@ -267,7 +267,7 @@
     // the parent selector is pre-pended to the current selector.
     var hasThis = current.any((s) => s.simpleSelector.isThis);
 
-    var newSequence = [];
+    var newSequence = <SimpleSelectorSequence>[];
 
     if (!hasThis) {
       // If no & in the sector group then prefix with the parent selector.
@@ -302,7 +302,7 @@
       List<SimpleSelectorSequence> sequences) {
     if (sequences.isEmpty) return sequences;
 
-    var newSequences = [];
+    var newSequences = <SimpleSelectorSequence>[];
     var first = sequences.first;
     newSequences.add(new SimpleSelectorSequence(
         first.simpleSelector, first.span, TokenKind.COMBINATOR_DESCENDANT));
@@ -592,7 +592,7 @@
    * Given a mixin's defined arguments return a cloned mixin defintion that has
    * replaced all defined arguments with user's supplied VarUsages.
    */
-  MixinDefinition transform(List callArgs) {
+  MixinDefinition transform(List<List<Expression>> callArgs) {
     // TODO(terry): Handle default arguments and varArgs.
     // Transform mixin with callArgs.
     for (var index = 0; index < _definedArgs.length; index++) {
@@ -628,11 +628,11 @@
   }
 
   /** Rip apart var def with multiple parameters. */
-  List<List<TreeNode>> _varDefsAsCallArgs(var callArg) {
-    var defArgs = [];
+  List<List<Expression>> _varDefsAsCallArgs(var callArg) {
+    var defArgs = <List<Expression>>[];
     if (callArg is List && callArg[0] is VarUsage) {
       var varDef = varDefs[callArg[0].name];
-      var expressions = varDef.expression.expressions;
+      var expressions = (varDef.expression as Expressions).expressions;
       assert(expressions.length > 1);
       for (var expr in expressions) {
         if (expr is! OperatorComma) {
@@ -756,11 +756,11 @@
           // We're a list of @include(s) inside of a mixin ruleset - convert
           // to a list of IncludeMixinAtDeclaration(s).
           var origRulesets = mixinDef.rulesets;
-          var rulesets = [];
+          var rulesets = <Declaration>[];
           if (origRulesets.every((ruleset) => ruleset is IncludeDirective)) {
             origRulesets.forEach((ruleset) {
-              rulesets
-                  .add(new IncludeMixinAtDeclaration(ruleset, ruleset.span));
+              rulesets.add(new IncludeMixinAtDeclaration(
+                  ruleset as IncludeDirective, ruleset.span));
             });
             _IncludeReplacer.replace(_styleSheet, node, rulesets);
           }
@@ -841,7 +841,7 @@
 /** @include as a top-level with ruleset(s). */
 class _IncludeReplacer extends Visitor {
   final _include;
-  final List<Declaration> _newDeclarations;
+  final List<TreeNode> _newDeclarations;
   bool _foundAndReplaced = false;
 
   /**
@@ -849,7 +849,7 @@
    * with the [newRules].
    */
   static void replace(
-      StyleSheet ss, var include, List<Declaration> newDeclarations) {
+      StyleSheet ss, var include, List<TreeNode> newDeclarations) {
     var visitor = new _IncludeReplacer(include, newDeclarations);
     visitor.visitStyleSheet(ss);
   }
diff --git a/lib/src/polyfill.dart b/lib/src/polyfill.dart
index b18abd1..69f9e6d 100644
--- a/lib/src/polyfill.dart
+++ b/lib/src/polyfill.dart
@@ -170,7 +170,7 @@
   }
 
   List<Expression> resolveUsageTerminal(VarUsage usage) {
-    var result = [];
+    var result = <Expression>[];
 
     var varDef = _knownVarDefs[usage.name];
     var expressions;
diff --git a/lib/src/property.dart b/lib/src/property.dart
index c2cf776..b4beaee 100644
--- a/lib/src/property.dart
+++ b/lib/src/property.dart
@@ -1232,4 +1232,4 @@
   num get height => (top != null ? top : 0) + (bottom != null ? bottom : 0);
 }
 
-_mergeVal(x, y) => y != null ? y : x;
+/*=T*/ _mergeVal/*<T>*/(/*=T*/ x, /*=T*/ y) => y != null ? y : x;
diff --git a/lib/src/tokenizer.dart b/lib/src/tokenizer.dart
index d423104..bc00fee 100644
--- a/lib/src/tokenizer.dart
+++ b/lib/src/tokenizer.dart
@@ -260,7 +260,7 @@
   Token finishIdentifier() {
     // If we encounter an escape sequence, remember it so we can post-process
     // to unescape.
-    var chars = [];
+    var chars = <int>[];
 
     // backup so we can start with the first character
     int validateFrom = _index;
diff --git a/lib/src/tree.dart b/lib/src/tree.dart
index ba8370e..ded846d 100644
--- a/lib/src/tree.dart
+++ b/lib/src/tree.dart
@@ -421,7 +421,7 @@
       : super(span);
 
   ImportDirective clone() {
-    var cloneMediaQueries = [];
+    var cloneMediaQueries = <MediaQuery>[];
     for (var mediaQuery in mediaQueries) {
       cloneMediaQueries.add(mediaQuery.clone());
     }
@@ -483,7 +483,7 @@
       TokenKind.idToValue(TokenKind.MEDIA_OPERATORS, _mediaUnary).toUpperCase();
 
   MediaQuery clone() {
-    var cloneExpressions = [];
+    var cloneExpressions = <MediaExpression>[];
     for (var expr in expressions) {
       cloneExpressions.add(expr.clone());
     }
@@ -500,11 +500,11 @@
       : super(span);
 
   MediaDirective clone() {
-    var cloneQueries = [];
+    var cloneQueries = <MediaQuery>[];
     for (var mediaQuery in mediaQueries) {
       cloneQueries.add(mediaQuery.clone());
     }
-    var cloneRulesets = [];
+    var cloneRulesets = <RuleSet>[];
     for (var ruleset in rulesets) {
       cloneRulesets.add(ruleset.clone());
     }
@@ -520,7 +520,7 @@
   HostDirective(this.rulesets, SourceSpan span) : super(span);
 
   HostDirective clone() {
-    var cloneRulesets = [];
+    var cloneRulesets = <RuleSet>[];
     for (var ruleset in rulesets) {
       cloneRulesets.add(ruleset.clone());
     }
@@ -540,7 +540,7 @@
       : super(span);
 
   PageDirective clone() {
-    var cloneDeclsMargin = [];
+    var cloneDeclsMargin = <DeclarationGroup>[];
     for (var declMargin in _declsMargin) {
       cloneDeclsMargin.add(declMargin.clone());
     }
@@ -635,7 +635,7 @@
   bool get isExtension => true;
 
   StyletDirective clone() {
-    var cloneRulesets = [];
+    var cloneRulesets = <RuleSet>[];
     for (var ruleset in rulesets) {
       cloneRulesets.add(ruleset.clone());
     }
@@ -675,14 +675,14 @@
 
 class MixinDefinition extends Directive {
   final String name;
-  final List definedArgs;
+  final List<TreeNode> definedArgs;
   final bool varArgs;
 
   MixinDefinition(this.name, this.definedArgs, this.varArgs, SourceSpan span)
       : super(span);
 
   MixinDefinition clone() {
-    var cloneDefinedArgs = [];
+    var cloneDefinedArgs = <TreeNode>[];
     for (var definedArg in definedArgs) {
       cloneDefinedArgs.add(definedArg.clone());
     }
@@ -694,18 +694,18 @@
 
 /** Support a Sass @mixin. See http://sass-lang.com for description. */
 class MixinRulesetDirective extends MixinDefinition {
-  final List rulesets;
+  final List<TreeNode> rulesets;
 
-  MixinRulesetDirective(String name, List<VarDefinitionDirective> args,
+  MixinRulesetDirective(String name, List<VarDefinition> args,
       bool varArgs, this.rulesets, SourceSpan span)
       : super(name, args, varArgs, span);
 
   MixinRulesetDirective clone() {
-    var clonedArgs = [];
+    var clonedArgs = <VarDefinition>[];
     for (var arg in definedArgs) {
       clonedArgs.add(arg.clone());
     }
-    var clonedRulesets = [];
+    var clonedRulesets = <TreeNode>[];
     for (var ruleset in rulesets) {
       clonedRulesets.add(ruleset.clone());
     }
@@ -719,12 +719,12 @@
 class MixinDeclarationDirective extends MixinDefinition {
   final DeclarationGroup declarations;
 
-  MixinDeclarationDirective(String name, List<VarDefinitionDirective> args,
+  MixinDeclarationDirective(String name, List<TreeNode> args,
       bool varArgs, this.declarations, SourceSpan span)
       : super(name, args, varArgs, span);
 
   MixinDeclarationDirective clone() {
-    var clonedArgs = [];
+    var clonedArgs = <TreeNode>[];
     for (var arg in definedArgs) {
       clonedArgs.add(arg.clone());
     }
@@ -738,16 +738,14 @@
 /** To support consuming a SASS mixin @include. */
 class IncludeDirective extends Directive {
   final String name;
-  final List<List<TreeNode>> args;
+  final List<List<Expression>> args;
 
   IncludeDirective(this.name, this.args, SourceSpan span) : super(span);
 
   IncludeDirective clone() {
-    var cloneArgs = [];
+    var cloneArgs = <List<Expression>>[];
     for (var arg in args) {
-      for (var term in arg) {
-        cloneArgs.add(term.clone());
-      }
+      cloneArgs.add(arg.map((term) => term.clone()).toList());
     }
     return new IncludeDirective(name, cloneArgs, span);
   }
@@ -852,7 +850,7 @@
 
 class DeclarationGroup extends TreeNode {
   /** Can be either Declaration or RuleSet (if nested selector). */
-  final List declarations;
+  final List<TreeNode> declarations;
 
   DeclarationGroup(this.declarations, SourceSpan span) : super(span);
 
@@ -867,10 +865,10 @@
 class MarginGroup extends DeclarationGroup {
   final int margin_sym; // TokenType for for @margin sym.
 
-  MarginGroup(this.margin_sym, List<Declaration> decls, SourceSpan span)
+  MarginGroup(this.margin_sym, List<TreeNode> decls, SourceSpan span)
       : super(decls, span);
   MarginGroup clone() =>
-      new MarginGroup(margin_sym, super.clone() as dynamic, span);
+      new MarginGroup(margin_sym, super.clone().declarations, span);
   visit(VisitorBase visitor) => visitor.visitMarginGroup(this);
 }
 
@@ -881,7 +879,7 @@
   VarUsage(this.name, this.defaultValues, SourceSpan span) : super(span);
 
   VarUsage clone() {
-    var clonedValues = [];
+    var clonedValues = <Expression>[];
     for (var expr in defaultValues) {
       clonedValues.add(expr.clone());
     }
diff --git a/pubspec.yaml b/pubspec.yaml
index 96f403e..8a9507e 100644
--- a/pubspec.yaml
+++ b/pubspec.yaml
@@ -1,5 +1,5 @@
 name: csslib
-version: 0.12.2
+version: 0.13.0-dev
 author: Polymer.dart Team <web-ui-dev@dartlang.org>
 description: A library for parsing CSS.
 homepage: https://github.com/dart-lang/csslib
diff --git a/test/big_1_test.dart b/test/big_1_test.dart
index f92ea82..9a6a584 100644
--- a/test/big_1_test.dart
+++ b/test/big_1_test.dart
@@ -4,11 +4,12 @@
 
 library big_1_test;
 
+import 'package:csslib/src/messages.dart';
 import 'package:test/test.dart';
 import 'testing.dart';
 
 compilePolyfillAndValidate(String input, String generated) {
-  var errors = [];
+  var errors = <Message>[];
   var stylesheet = polyFillCompileCss(input, errors: errors, opts: options);
   expect(stylesheet != null, true);
   expect(errors.isEmpty, true, reason: errors.toString());
diff --git a/test/compiler_test.dart b/test/compiler_test.dart
index df5a44a..5faabe2 100644
--- a/test/compiler_test.dart
+++ b/test/compiler_test.dart
@@ -7,11 +7,12 @@
 import 'dart:convert';
 import 'package:test/test.dart';
 import 'package:csslib/parser.dart';
+import 'package:csslib/src/messages.dart';
 import 'package:csslib/visitor.dart';
 import 'testing.dart';
 
 void testClass() {
-  var errors = [];
+  var errors = <Message>[];
   var input = ".foobar {}";
   var stylesheet = parseCss(input, errors: errors);
 
@@ -24,7 +25,7 @@
 
   expect(stylesheet.topLevels[0] is RuleSet, true);
 
-  var ruleset = stylesheet.topLevels[0];
+  var ruleset = stylesheet.topLevels[0] as RuleSet;
   expect(ruleset.selectorGroup.selectors.length, 1);
   expect(ruleset.declarationGroup.declarations.length, 0);
 
@@ -37,7 +38,7 @@
 }
 
 void testClass2() {
-  var errors = [];
+  var errors = <Message>[];
   var input = ".foobar .bar .no-story {}";
   var stylesheet = parseCss(input, errors: errors);
 
@@ -49,7 +50,7 @@
   expect(stylesheet.topLevels.length, 1);
 
   expect(stylesheet.topLevels[0] is RuleSet, true);
-  var ruleset = stylesheet.topLevels[0];
+  var ruleset = stylesheet.topLevels[0] as RuleSet;
   expect(ruleset.selectorGroup.selectors.length, 1);
   expect(ruleset.declarationGroup.declarations.length, 0);
 
@@ -73,7 +74,7 @@
 }
 
 void testId() {
-  var errors = [];
+  var errors = <Message>[];
   var input = "#elemId {}";
   var stylesheet = parseCss(input, errors: errors);
 
@@ -85,7 +86,7 @@
   expect(stylesheet.topLevels.length, 1);
 
   expect(stylesheet.topLevels[0] is RuleSet, true);
-  var ruleset = stylesheet.topLevels[0];
+  var ruleset = stylesheet.topLevels[0] as RuleSet;
   expect(ruleset.selectorGroup.selectors.length, 1);
   expect(ruleset.declarationGroup.declarations.length, 0);
 
@@ -99,7 +100,7 @@
 }
 
 void testElement() {
-  var errors = [];
+  var errors = <Message>[];
   var input = "div {}";
   var stylesheet = parseCss(input, errors: errors);
 
@@ -111,7 +112,7 @@
   expect(stylesheet.topLevels.length, 1);
 
   expect(stylesheet.topLevels[0] is RuleSet, true);
-  var ruleset = stylesheet.topLevels[0];
+  var ruleset = stylesheet.topLevels[0] as RuleSet;
   expect(ruleset.selectorGroup.selectors.length, 1);
   expect(ruleset.declarationGroup.declarations.length, 0);
 
@@ -160,7 +161,7 @@
 }
 
 void testNamespace() {
-  var errors = [];
+  var errors = <Message>[];
   var input = "ns1|div {}";
   var stylesheet = parseCss(input, errors: errors);
 
@@ -172,15 +173,15 @@
   expect(stylesheet.topLevels.length, 1);
 
   expect(stylesheet.topLevels[0] is RuleSet, true);
-  var ruleset = stylesheet.topLevels[0];
+  var ruleset = stylesheet.topLevels[0] as RuleSet;
   expect(ruleset.selectorGroup.selectors.length, 1);
   expect(ruleset.declarationGroup.declarations.length, 0);
 
   var simpleSeqs = ruleset.selectorGroup.selectors[0].simpleSelectorSequences;
 
   expect(simpleSeqs.length, 1);
-  var simpSelector = simpleSeqs[0].simpleSelector;
-  expect(simpSelector is NamespaceSelector, true);
+  expect(simpleSeqs[0].simpleSelector is NamespaceSelector, true);
+  var simpSelector = simpleSeqs[0].simpleSelector as NamespaceSelector;
   expect(simpleSeqs[0].isCombinatorNone, true);
   expect(simpSelector.isNamespaceWildcard, false);
   expect(simpSelector.namespace, "ns1");
@@ -191,7 +192,7 @@
 }
 
 void testNamespace2() {
-  var errors = [];
+  var errors = <Message>[];
   var input = "ns1|div div ns2|span .foobar {}";
   var stylesheet = parseCss(input, errors: errors);
 
@@ -203,7 +204,7 @@
   expect(stylesheet.topLevels.length, 1);
 
   expect(stylesheet.topLevels[0] is RuleSet, true);
-  var ruleset = stylesheet.topLevels[0];
+  var ruleset = stylesheet.topLevels[0] as RuleSet;
   expect(ruleset.selectorGroup.selectors.length, 1);
   expect(ruleset.declarationGroup.declarations.length, 0);
 
@@ -211,8 +212,8 @@
 
   expect(simpleSeqs.length, 4);
 
-  var simpSelector0 = simpleSeqs[0].simpleSelector;
-  expect(simpSelector0 is NamespaceSelector, true);
+  expect(simpleSeqs[0].simpleSelector is NamespaceSelector, true);
+  var simpSelector0 = simpleSeqs[0].simpleSelector as NamespaceSelector;
   expect(simpleSeqs[0].isCombinatorNone, true);
   expect(simpSelector0.namespace, "ns1");
   var elementSelector0 = simpSelector0.nameAsSimpleSelector;
@@ -225,8 +226,8 @@
   expect(simpleSeqs[1].isCombinatorDescendant, true);
   expect(simpSelector1.name, "div");
 
-  var simpSelector2 = simpleSeqs[2].simpleSelector;
-  expect(simpSelector2 is NamespaceSelector, true);
+  expect(simpleSeqs[2].simpleSelector is NamespaceSelector, true);
+  var simpSelector2 = simpleSeqs[2].simpleSelector as NamespaceSelector;
   expect(simpleSeqs[2].isCombinatorDescendant, true);
   expect(simpSelector2.namespace, "ns2");
   var elementSelector2 = simpSelector2.nameAsSimpleSelector;
@@ -241,7 +242,7 @@
 }
 
 void testSelectorGroups() {
-  var errors = [];
+  var errors = <Message>[];
   var input =
       "div, .foobar ,#elemId, .xyzzy .test, ns1|div div #elemId .foobar {}";
   var stylesheet = parseCss(input, errors: errors);
@@ -254,7 +255,7 @@
   expect(stylesheet.topLevels.length, 1);
 
   expect(stylesheet.topLevels[0] is RuleSet, true);
-  var ruleset = stylesheet.topLevels[0];
+  var ruleset = stylesheet.topLevels[0] as RuleSet;
   expect(ruleset.selectorGroup.selectors.length, 5);
   expect(ruleset.declarationGroup.declarations.length, 0);
 
@@ -301,8 +302,8 @@
   expect(groupSelector4.simpleSelectorSequences.length, 4);
 
   var selector40 = groupSelector4.simpleSelectorSequences[0];
-  var simpleSelector40 = selector40.simpleSelector;
-  expect(simpleSelector40 is NamespaceSelector, true);
+  expect(selector40.simpleSelector is NamespaceSelector, true);
+  var simpleSelector40 = selector40.simpleSelector as NamespaceSelector;
   expect(selector40.isCombinatorNone, true);
   expect(simpleSelector40.namespace, "ns1");
   var elementSelector = simpleSelector40.nameAsSimpleSelector;
@@ -329,7 +330,7 @@
 }
 
 void testCombinator() {
-  var errors = [];
+  var errors = <Message>[];
   var input = ".foobar > .bar + .no-story ~ myNs|div #elemId {}";
   var stylesheet = parseCss(input, errors: errors);
 
@@ -341,7 +342,7 @@
   expect(stylesheet.topLevels.length, 1);
 
   expect(stylesheet.topLevels[0] is RuleSet, true);
-  var ruleset = stylesheet.topLevels[0];
+  var ruleset = stylesheet.topLevels[0] as RuleSet;
   expect(ruleset.selectorGroup.selectors.length, 1);
   expect(ruleset.declarationGroup.declarations.length, 0);
 
@@ -368,8 +369,8 @@
   expect(simpleSelector2.name, "no-story");
 
   var selector3 = simpleSeqs[3];
-  var simpleSelector3 = selector3.simpleSelector;
-  expect(simpleSelector3 is NamespaceSelector, true);
+  expect(selector3.simpleSelector is NamespaceSelector, true);
+  var simpleSelector3 = selector3.simpleSelector as NamespaceSelector;
   expect(selector3.isCombinatorTilde, true);
   expect(simpleSelector3.namespace, "myNs");
   var elementSelector = simpleSelector3.nameAsSimpleSelector;
@@ -385,7 +386,7 @@
 }
 
 void testWildcard() {
-  var errors = [];
+  var errors = <Message>[];
   var input = "* {}";
   var stylesheet = parseCss(input, errors: errors);
 
@@ -397,7 +398,7 @@
   expect(stylesheet.topLevels.length, 1);
 
   expect(stylesheet.topLevels[0] is RuleSet, true);
-  var ruleset = stylesheet.topLevels[0];
+  var ruleset = stylesheet.topLevels[0] as RuleSet;
   expect(ruleset.selectorGroup.selectors.length, 1);
   expect(ruleset.declarationGroup.declarations.length, 0);
 
@@ -429,12 +430,14 @@
 
   expect(simpleSeqs.length, 2);
 
-  var selector0 = simpleSeqs[0];
-  var simpleSelector0 = selector0.simpleSelector;
-  expect(simpleSelector0 is ElementSelector, true);
-  expect(selector0.isCombinatorNone, true);
-  expect(simpleSelector0.isWildcard, true);
-  expect(simpleSelector0.name, "*");
+  {
+    var selector0 = simpleSeqs[0];
+    var simpleSelector0 = selector0.simpleSelector;
+    expect(simpleSelector0 is ElementSelector, true);
+    expect(selector0.isCombinatorNone, true);
+    expect(simpleSelector0.isWildcard, true);
+    expect(simpleSelector0.name, "*");
+  }
 
   var selector1 = simpleSeqs[1];
   var simpleSelector1 = selector1.simpleSelector;
@@ -461,15 +464,17 @@
 
   expect(simpleSeqs.length, 2);
 
-  selector0 = simpleSeqs[0];
-  simpleSelector0 = selector0.simpleSelector;
-  expect(simpleSelector0 is NamespaceSelector, true);
-  expect(selector0.isCombinatorNone, true);
-  expect(simpleSelector0.isNamespaceWildcard, false);
-  var elementSelector = simpleSelector0.nameAsSimpleSelector;
-  expect("myNs", simpleSelector0.namespace);
-  expect(elementSelector.isWildcard, true);
-  expect("*", elementSelector.name);
+  {
+    var selector0 = simpleSeqs[0];
+    expect(selector0.simpleSelector is NamespaceSelector, true);
+    var simpleSelector0 = selector0.simpleSelector as NamespaceSelector;
+    expect(selector0.isCombinatorNone, true);
+    expect(simpleSelector0.isNamespaceWildcard, false);
+    var elementSelector = simpleSelector0.nameAsSimpleSelector;
+    expect("myNs", simpleSelector0.namespace);
+    expect(elementSelector.isWildcard, true);
+    expect("*", elementSelector.name);
+  }
 
   selector1 = simpleSeqs[1];
   simpleSelector1 = selector1.simpleSelector;
@@ -494,15 +499,17 @@
 
   expect(simpleSeqs.length, 2);
 
-  selector0 = simpleSeqs[0];
-  simpleSelector0 = selector0.simpleSelector;
-  expect(simpleSelector0 is NamespaceSelector, true);
-  expect(selector0.isCombinatorNone, true);
-  expect(simpleSelector0.isNamespaceWildcard, true);
-  expect("*", simpleSelector0.namespace);
-  elementSelector = simpleSelector0.nameAsSimpleSelector;
-  expect(elementSelector.isWildcard, true);
-  expect("*", elementSelector.name);
+  {
+    var selector0 = simpleSeqs[0];
+    expect(selector0.simpleSelector is NamespaceSelector, true);
+    var simpleSelector0 = selector0.simpleSelector as NamespaceSelector;
+    expect(selector0.isCombinatorNone, true);
+    expect(simpleSelector0.isNamespaceWildcard, true);
+    expect("*", simpleSelector0.namespace);
+    var elementSelector = simpleSelector0.nameAsSimpleSelector;
+    expect(elementSelector.isWildcard, true);
+    expect("*", elementSelector.name);
+  }
 
   selector1 = simpleSeqs[1];
   simpleSelector1 = selector1.simpleSelector;
@@ -513,7 +520,7 @@
 
 /** Test List<int> as input to parser. */
 void testArrayOfChars() {
-  var errors = [];
+  var errors = <Message>[];
   var input = '<![CDATA[.foo { '
       'color: red; left: 20px; top: 20px; width: 100px; height:200px'
       '}'
@@ -541,7 +548,7 @@
 }
 
 void testPseudo() {
-  var errors = [];
+  var errors = <Message>[];
 
   final input = r'''
 html:lang(fr-ca) { quotes: '" ' ' "' }
@@ -643,7 +650,7 @@
 }
 
 void testHost() {
-  var errors = [];
+  var errors = <Message>[];
   var input = '@host { '
       ':scope {'
       'white-space: nowrap;'
@@ -678,7 +685,7 @@
 }
 
 void testStringEscape() {
-  var errors = [];
+  var errors = <Message>[];
   var input = r'''a { foo: '{"text" : "a\\\""}' }''';
   var stylesheet = parseCss(input, errors: errors, opts: simpleOptions);
   expect(stylesheet != null, true);
@@ -692,7 +699,7 @@
 
 // TODO(terry): Move to emitter_test.dart when real emitter exist.
 void testEmitter() {
-  var errors = [];
+  var errors = <Message>[];
   var input = '.foo { '
       'color: red; left: 20px; top: 20px; width: 100px; height:200px'
       '}'
diff --git a/test/declaration_test.dart b/test/declaration_test.dart
index de589d7..a553522 100644
--- a/test/declaration_test.dart
+++ b/test/declaration_test.dart
@@ -4,12 +4,14 @@
 
 library declaration_test;
 
+import 'package:csslib/src/messages.dart';
+import 'package:csslib/visitor.dart';
 import 'package:test/test.dart';
 
 import 'testing.dart';
 
 void testSimpleTerms() {
-  var errors = [];
+  var errors = <Message>[];
   final String input = r'''
 @ import url("test.css");
 .foo {
@@ -64,7 +66,7 @@
  * no quotes.  Hex values with # and letters, and functions (rgba, url, etc.)
  */
 void testDeclarations() {
-  var errors = [];
+  var errors = <Message>[];
   final String input = r'''
 .more {
   color: white;
@@ -102,7 +104,7 @@
 }
 
 void testIdentifiers() {
-  var errors = [];
+  var errors = <Message>[];
   final String input = r'''
 #da {
   height: 100px;
@@ -129,7 +131,7 @@
 }
 
 void testComposites() {
-  var errors = [];
+  var errors = <Message>[];
   final String input = r'''
 .xyzzy {
   border: 10px 80px 90px 100px;
@@ -158,7 +160,7 @@
 }
 
 void testUnits() {
-  var errors = [];
+  var errors = <Message>[];
   final String input = r'''
 #id-1 {
   transition: color 0.4s;
@@ -242,7 +244,7 @@
 }
 
 void testUnicode() {
-  var errors = [];
+  var errors = <Message>[];
   final String input = r'''
 .toggle:after {
   content: '✔';
@@ -270,7 +272,7 @@
 }
 
 void testNewerCss() {
-  var errors = [];
+  var errors = <Message>[];
   final String input = r'''
 @media screen,print {
   .foobar_screen {
@@ -317,7 +319,7 @@
 }
 
 void testMediaQueries() {
-  var errors = [];
+  var errors = <Message>[];
   String input = '''
 @media screen and (-webkit-min-device-pixel-ratio:0) {
   .todo-item .toggle {
@@ -435,7 +437,7 @@
 }
 
 void testFontFace() {
-  var errors = [];
+  var errors = <Message>[];
 
   final String input = '''
 @font-face {
@@ -527,7 +529,7 @@
 }
 
 void testCssFile() {
-  var errors = [];
+  var errors = <Message>[];
   final String input = r'''
 @import 'simple.css'
 @import "test.css" print
@@ -591,7 +593,7 @@
 }
 
 void testCompactEmitter() {
-  var errors = [];
+  var errors = <Message>[];
 
   // Check !import compactly emitted.
   final String input = r'''
@@ -619,7 +621,7 @@
 }
 
 void testNotSelectors() {
-  var errors = [];
+  var errors = <Message>[];
 
   final String input = r'''
 .details:not(.open-details) x-element,
@@ -709,7 +711,7 @@
 }
 
 void testIE() {
-  var errors = [];
+  var errors = <Message>[];
   final String input = ".test {\n"
       "  filter: progid:DXImageTransform.Microsoft.gradient"
       "(GradientType=0,StartColorStr='#9d8b83', EndColorStr='#847670');\n"
@@ -785,7 +787,7 @@
  *        background: red\9;
  */
 void testIEDeclaration() {
-  var errors = [];
+  var errors = <Message>[];
 
   final input = '''
 .testIE-6 {
@@ -951,7 +953,7 @@
 }
 
 void testHangs() {
-  var errors = [];
+  var errors = <Message>[];
 
   // Bad hexvalue had caused a hang in processTerm.
   final input = r'''#a { color: #ebebeburl(0/IE8+9+); }''';
@@ -1008,36 +1010,48 @@
 void testExpressionSpans() {
   final input = r'''.foo { width: 50px; }''';
   var stylesheet = parseCss(input);
-  var decl = stylesheet.topLevels.single.declarationGroup.declarations.single;
+  var decl = (stylesheet.topLevels.single as RuleSet)
+      .declarationGroup
+      .declarations
+      .single;
   // This passes
   expect(decl.span.text, 'width: 50px');
   // This currently fails
-  expect(decl.expression.span.text, '50px');
+  expect((decl as Declaration).expression.span.text, '50px');
 }
 
 void simpleCalc() {
   final input = r'''.foo { height: calc(100% - 55px); }''';
   var stylesheet = parseCss(input);
-  var decl = stylesheet.topLevels.single.declarationGroup.declarations.single;
+  var decl = (stylesheet.topLevels.single as RuleSet)
+      .declarationGroup
+      .declarations
+      .single;
   expect(decl.span.text, 'height: calc(100% - 55px)');
 }
 
 void complexCalc() {
   final input = r'''.foo { left: calc((100%/3 - 2) * 1em - 2 * 1px); }''';
   var stylesheet = parseCss(input);
-  var decl = stylesheet.topLevels.single.declarationGroup.declarations.single;
+  var decl = (stylesheet.topLevels.single as RuleSet)
+      .declarationGroup
+      .declarations
+      .single;
   expect(decl.span.text, 'left: calc((100%/3 - 2) * 1em - 2 * 1px)');
 }
 
 void twoCalcs() {
   final input = r'''.foo { margin: calc(1rem - 2px) calc(1rem - 1px); }''';
   var stylesheet = parseCss(input);
-  var decl = stylesheet.topLevels.single.declarationGroup.declarations.single;
+  var decl = (stylesheet.topLevels.single as RuleSet)
+      .declarationGroup
+      .declarations
+      .single;
   expect(decl.span.text, 'margin: calc(1rem - 2px) calc(1rem - 1px)');
 }
 
 void selectorWithCalcs() {
-  var errors = [];
+  var errors = <Message>[];
   final String input = r'''
 .foo {
   width: calc(1em + 5 * 2em);
@@ -1079,7 +1093,7 @@
   test('Hanging bugs', testHangs);
   test('Expression spans', testExpressionSpans,
       skip: 'expression spans are broken'
-            ' (https://github.com/dart-lang/csslib/issues/15)');
+          ' (https://github.com/dart-lang/csslib/issues/15)');
   group('calc function', () {
     test('simple calc', simpleCalc);
     test('single complex', complexCalc);
@@ -1087,4 +1101,3 @@
     test('selector with many calc declarations', selectorWithCalcs);
   });
 }
-
diff --git a/test/error_test.dart b/test/error_test.dart
index fc9ecf6..9815b1b 100644
--- a/test/error_test.dart
+++ b/test/error_test.dart
@@ -13,7 +13,7 @@
  * Test for unsupported font-weights values of bolder, lighter and inherit.
  */
 void testUnsupportedFontWeights() {
-  var errors = [];
+  var errors = <Message>[];
 
   // TODO(terry): Need to support bolder.
   // font-weight value bolder.
@@ -70,7 +70,7 @@
  * inherit.
  */
 void testUnsupportedLineHeights() {
-  var errors = [];
+  var errors = <Message>[];
 
   // line-height value in percentge unit.
   var input = ".foobar { line-height: 120%; }";
@@ -122,7 +122,7 @@
 
 /** Test for bad selectors. */
 void testBadSelectors() {
-  var errors = [];
+  var errors = <Message>[];
 
   // Invalid id selector.
   var input = "# foo { color: #ff00ff; }";
@@ -157,7 +157,7 @@
 
 /** Test for bad hex values. */
 void testBadHexValues() {
-  var errors = [];
+  var errors = <Message>[];
 
   // Invalid hex value.
   var input = ".foobar { color: #AH787; }";
@@ -227,7 +227,7 @@
 }
 
 void testBadUnicode() {
-  var errors = [];
+  var errors = <Message>[];
   final String input = '''
 @font-face {
   src: url(fonts/BBCBengali.ttf) format("opentype");
@@ -259,7 +259,7 @@
 }
 
 void testBadNesting() {
-  var errors = [];
+  var errors = <Message>[];
 
   // Test for bad declaration in a nested rule.
   final String input = '''
diff --git a/test/extend_test.dart b/test/extend_test.dart
index 49c8a9c..afec062 100644
--- a/test/extend_test.dart
+++ b/test/extend_test.dart
@@ -4,12 +4,13 @@
 
 library extend_test;
 
+import 'package:csslib/src/messages.dart';
 import 'package:test/test.dart';
 
 import 'testing.dart';
 
 compileAndValidate(String input, String generated) {
-  var errors = [];
+  var errors = <Message>[];
   var stylesheet = compileCss(input, errors: errors, opts: options);
   expect(stylesheet != null, true);
   expect(errors.isEmpty, true, reason: errors.toString());
diff --git a/test/mixin_test.dart b/test/mixin_test.dart
index c94c9c0..71dcc50 100644
--- a/test/mixin_test.dart
+++ b/test/mixin_test.dart
@@ -4,12 +4,13 @@
 
 library mixin_test;
 
+import 'package:csslib/src/messages.dart';
 import 'package:test/test.dart';
 
 import 'testing.dart';
 
 compileAndValidate(String input, String generated) {
-  var errors = [];
+  var errors = <Message>[];
   var stylesheet = compileCss(input, errors: errors, opts: options);
   expect(stylesheet != null, true);
   expect(errors.isEmpty, true, reason: errors.toString());
@@ -17,7 +18,7 @@
 }
 
 compilePolyfillAndValidate(String input, String generated) {
-  var errors = [];
+  var errors = <Message>[];
   var stylesheet = polyFillCompileCss(input, errors: errors, opts: options);
   expect(stylesheet != null, true);
   expect(errors.isEmpty, true, reason: errors.toString());
@@ -413,7 +414,7 @@
 }
 
 void badDeclarationInclude() {
-  final errors = [];
+  final errors = <Message>[];
   final input = r'''
 @mixin a {
   #foo-id {
@@ -441,7 +442,7 @@
 }
 
 void badTopInclude() {
-  final errors = [];
+  final errors = <Message>[];
   final input = r'''
 @mixin b {
   color: red;
@@ -467,7 +468,7 @@
 }
 
 void emptyMixin() {
-  final errors = [];
+  final errors = <Message>[];
   final input = r'''
 @mixin a {
 }
@@ -492,7 +493,7 @@
 }
 
 void undefinedTopLevel() {
-  final errors = [];
+  final errors = <Message>[];
   final input = r'''
 @mixin a {
   @include b;
@@ -520,7 +521,7 @@
 }
 
 void undefinedDeclaration() {
-  final errors = [];
+  final errors = <Message>[];
   final input = r'''
 @mixin a {
   @include b;
@@ -578,7 +579,7 @@
   color: #f00;
 }''');
 
-  var errors = [];
+  var errors = <Message>[];
   var input = r'''
 @mixin a {
   foo { color: red }
diff --git a/test/nested_test.dart b/test/nested_test.dart
index 1848ef1..a5cadab 100644
--- a/test/nested_test.dart
+++ b/test/nested_test.dart
@@ -4,12 +4,13 @@
 
 library nested_test;
 
+import 'package:csslib/src/messages.dart';
 import 'package:test/test.dart';
 
 import 'testing.dart';
 
 compileAndValidate(String input, String generated) {
-  var errors = [];
+  var errors = <Message>[];
   var stylesheet = compileCss(input, errors: errors, opts: simpleOptions);
   expect(stylesheet != null, true);
   expect(errors.isEmpty, true, reason: errors.toString());
diff --git a/test/selector_test.dart b/test/selector_test.dart
index aefab16..6249d31 100644
--- a/test/selector_test.dart
+++ b/test/selector_test.dart
@@ -5,12 +5,13 @@
 library selector_test;
 
 import 'package:csslib/parser.dart';
+import 'package:csslib/src/messages.dart';
 import 'package:test/test.dart';
 
 import 'testing.dart';
 
 void testSelectorSuccesses() {
-  var errors = [];
+  var errors = <Message>[];
   var selectorAst = selector('#div .foo', errors: errors);
   expect(errors.isEmpty, true, reason: errors.toString());
   expect('#div .foo', compactOuptut(selectorAst));
@@ -50,7 +51,7 @@
 // TODO(terry): Move this failure case to a failure_test.dart when the analyzer
 //              and validator exit then they'll be a bunch more checks.
 void testSelectorFailures() {
-  var errors = [];
+  var errors = <Message>[];
 
   // Test for invalid class name (can't start with number).
   selector('.foobar .1a-story .xyzzy', errors: errors);
diff --git a/test/var_test.dart b/test/var_test.dart
index d47fd78..c75de56 100644
--- a/test/var_test.dart
+++ b/test/var_test.dart
@@ -4,12 +4,13 @@
 
 library var_test;
 
+import 'package:csslib/src/messages.dart';
 import 'package:test/test.dart';
 
 import 'testing.dart';
 
 compileAndValidate(String input, String generated) {
-  var errors = [];
+  var errors = <Message>[];
   var stylesheet = compileCss(input, errors: errors, opts: options);
   expect(stylesheet != null, true);
   expect(errors.isEmpty, true, reason: errors.toString());
@@ -17,7 +18,7 @@
 }
 
 compilePolyfillAndValidate(String input, String generated) {
-  var errors = [];
+  var errors = <Message>[];
   var stylesheet = polyFillCompileCss(input, errors: errors, opts: options);
   expect(stylesheet != null, true);
   expect(errors.isEmpty, true, reason: errors.toString());
@@ -340,7 +341,7 @@
 }
 
 void undefinedVars() {
-  final errors = [];
+  final errors = <Message>[];
   final input = ''':root {
   var-color-background: red;
   var-color-foreground: blue;
@@ -622,7 +623,7 @@
 }
 
 testVar() {
-  final errors = [];
+  final errors = <Message>[];
   final input = '''
 @color-background: red;
 @color-foreground: blue;
@@ -676,7 +677,7 @@
 }
 
 testLess() {
-  final errors = [];
+  final errors = <Message>[];
   final input = '''
 @color-background: red;
 @color-foreground: blue;
@@ -772,7 +773,7 @@
 }
 
 void includes() {
-  var errors = [];
+  var errors = <Message>[];
   var file1Input = r'''
 :root {
   var-redef: #0f0;
diff --git a/test/visitor_test.dart b/test/visitor_test.dart
index 803b106..02784c4 100644
--- a/test/visitor_test.dart
+++ b/test/visitor_test.dart
@@ -4,6 +4,7 @@
 
 library visitor_test;
 
+import 'package:csslib/src/messages.dart';
 import 'package:csslib/visitor.dart';
 import 'package:test/test.dart';
 
@@ -33,7 +34,7 @@
 }
 
 void testClassVisitors() {
-  var errors = [];
+  var errors = <Message>[];
   var in1 = '.foobar { }';
 
   var s = parseCss(in1, errors: errors);
@@ -84,7 +85,7 @@
     (new PolyfillEmitter(prefix)..visitTree(ss, pretty: true)).toString();
 
 void testPolyFill() {
-  var errors = [];
+  var errors = <Message>[];
   final input = r'''
 .foobar { }
 div.xyzzy { }
