diff --git a/pkg/analyzer/test/generated/parser_fasta_test.dart b/pkg/analyzer/test/generated/parser_fasta_test.dart
index b4674f0..753fac2 100644
--- a/pkg/analyzer/test/generated/parser_fasta_test.dart
+++ b/pkg/analyzer/test/generated/parser_fasta_test.dart
@@ -20,7 +20,7 @@
 import 'package:front_end/src/fasta/parser/forwarding_listener.dart' as fasta;
 import 'package:front_end/src/fasta/parser/parser.dart' as fasta;
 import 'package:front_end/src/fasta/scanner.dart'
-    show ScannerResult, scanString;
+    show ScannerConfiguration, ScannerResult, scanString;
 import 'package:front_end/src/fasta/scanner/error_token.dart' show ErrorToken;
 import 'package:front_end/src/fasta/scanner/string_scanner.dart';
 import 'package:front_end/src/scanner/errors.dart' show translateErrorToken;
@@ -1515,10 +1515,8 @@
   void createParser(String content,
       {int expectedEndOffset, FeatureSet featureSet}) {
     featureSet ??= FeatureSet.forTesting();
-    var scanner = new StringScanner(content, includeComments: true);
-    if (featureSet != null) {
-      scanner.enableNonNullable = featureSet.isEnabled(Feature.non_nullable);
-    }
+    var scanner = new StringScanner(content,
+        configuration: ScannerConfiguration.nonNullable, includeComments: true);
     _fastaTokens = scanner.tokenize();
     _parserProxy = new ParserProxy(_fastaTokens, featureSet,
         allowNativeClause: allowNativeClause,
@@ -2297,6 +2295,23 @@
 ''', featureSet: preNonNullable);
   }
 
+  void test_late_as_identifier_opt_out() {
+    parseCompilationUnit('''
+// @dart = 2.2
+class C {
+  int late;
+}
+
+void f(C c) {
+  print(c.late);
+}
+
+main() {
+  f(new C());
+}
+''', featureSet: nonNullable);
+  }
+
   void test_nullCheck() {
     var unit = parseNNBDCompilationUnit('f(int? y) { var x = y!; }');
     FunctionDeclaration function = unit.declarations[0];
diff --git a/pkg/front_end/lib/src/fasta/scanner/abstract_scanner.dart b/pkg/front_end/lib/src/fasta/scanner/abstract_scanner.dart
index 5d6c139..337a7b7 100644
--- a/pkg/front_end/lib/src/fasta/scanner/abstract_scanner.dart
+++ b/pkg/front_end/lib/src/fasta/scanner/abstract_scanner.dart
@@ -976,6 +976,7 @@
     }
 
     languageVersion = createLanguageVersionToken(start, major, minor);
+    configuration = ScannerConfiguration.from(languageVersion);
     if (includeComments) {
       _appendToCommentStream(languageVersion);
     }
@@ -1531,6 +1532,13 @@
 /// the scanner produces based upon the Dart language level.
 class ScannerConfiguration {
   static const classic = ScannerConfiguration();
+  static const nonNullable = ScannerConfiguration(enableNonNullable: true);
+
+  /// Return the scanner configuration for the given language version.
+  static ScannerConfiguration from(LanguageVersionToken languageVersion) {
+    // TODO(danrubel): update this to return config for new releases
+    return classic;
+  }
 
   /// Experimental flag for enabling scanning of NNBD tokens
   /// such as 'required' and 'late'
diff --git a/pkg/front_end/test/scanner_fasta_test.dart b/pkg/front_end/test/scanner_fasta_test.dart
index 8c524fc..d4f785b 100644
--- a/pkg/front_end/test/scanner_fasta_test.dart
+++ b/pkg/front_end/test/scanner_fasta_test.dart
@@ -837,6 +837,17 @@
     expectComments(result.tokens, ['// @dart = 2.3'], 0);
   }
 
+  void test_languageVersion_beforeLibrary_noSpaces() {
+    var result = scanSource('''
+// @dart=2.3
+library foo;
+main() {}
+''');
+    expect(result.languageVersion.major, 2);
+    expect(result.languageVersion.minor, 3);
+    expectComments(result.tokens, ['// @dart=2.3'], 0);
+  }
+
   void test_languageVersion_incomplete_version() {
     var result = scanSource('''
 // @dart = 2.
diff --git a/pkg/front_end/test/token_test.dart b/pkg/front_end/test/token_test.dart
index ec1becf..fb9f1ae 100644
--- a/pkg/front_end/test/token_test.dart
+++ b/pkg/front_end/test/token_test.dart
@@ -2,6 +2,7 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
+import 'package:front_end/src/fasta/scanner.dart' show ScannerConfiguration;
 import 'package:front_end/src/fasta/scanner/string_scanner.dart';
 import 'package:front_end/src/scanner/token.dart';
 import 'package:test/test.dart';
@@ -125,8 +126,9 @@
     ]);
     for (Keyword keyword in Keyword.values) {
       var isModifier = modifierKeywords.contains(keyword);
-      var scanner = new StringScanner(keyword.lexeme, includeComments: true)
-        ..enableNonNullable = true;
+      var scanner = new StringScanner(keyword.lexeme,
+          configuration: ScannerConfiguration.nonNullable,
+          includeComments: true);
       Token token = scanner.tokenize();
       expect(token.isModifier, isModifier, reason: keyword.name);
       if (isModifier) {
