diff --git a/CHANGELOG.md b/CHANGELOG.md
index 5b51135..4f63399 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -1,3 +1,7 @@
+## 2.3.0-dev
+
+* Allow `YamlNode`s to be wrapped with an optional `style` parameter.
+
 ## 2.2.1
 
 * Update min Dart SDK to `2.4.0`.
diff --git a/lib/src/yaml_node.dart b/lib/src/yaml_node.dart
index 25982e8..bbba77e 100644
--- a/lib/src/yaml_node.dart
+++ b/lib/src/yaml_node.dart
@@ -77,8 +77,9 @@
   /// passed, it's used as the [SourceSpan.sourceUrl].
   ///
   /// [sourceUrl] may be either a [String], a [Uri], or `null`.
-  factory YamlMap.wrap(Map dartMap, {sourceUrl}) =>
-      YamlMapWrapper(dartMap, sourceUrl);
+  factory YamlMap.wrap(Map dartMap,
+          {sourceUrl, CollectionStyle style = CollectionStyle.ANY}) =>
+      YamlMapWrapper(dartMap, sourceUrl, style: style);
 
   /// Users of the library should not use this constructor.
   YamlMap.internal(Map<dynamic, YamlNode> nodes, SourceSpan span, this.style)
@@ -127,8 +128,9 @@
   /// passed, it's used as the [SourceSpan.sourceUrl].
   ///
   /// [sourceUrl] may be either a [String], a [Uri], or `null`.
-  factory YamlList.wrap(List dartList, {sourceUrl}) =>
-      YamlListWrapper(dartList, sourceUrl);
+  factory YamlList.wrap(List dartList,
+          {sourceUrl, CollectionStyle style = CollectionStyle.ANY}) =>
+      YamlListWrapper(dartList, sourceUrl, style: style);
 
   /// Users of the library should not use this constructor.
   YamlList.internal(List<YamlNode> nodes, SourceSpan span, this.style)
@@ -160,7 +162,8 @@
   /// [sourceUrl] is passed, it's used as the [SourceSpan.sourceUrl].
   ///
   /// [sourceUrl] may be either a [String], a [Uri], or `null`.
-  YamlScalar.wrap(this.value, {sourceUrl}) : style = ScalarStyle.ANY {
+  YamlScalar.wrap(this.value, {sourceUrl, this.style = ScalarStyle.ANY}) {
+    ArgumentError.checkNotNull(style, 'style');
     _span = NullSpan(sourceUrl);
   }
 
diff --git a/lib/src/yaml_node_wrapper.dart b/lib/src/yaml_node_wrapper.dart
index e714b65..1e44a09 100644
--- a/lib/src/yaml_node_wrapper.dart
+++ b/lib/src/yaml_node_wrapper.dart
@@ -16,7 +16,7 @@
     with pkg_collection.UnmodifiableMapMixin
     implements YamlMap {
   @override
-  final style = CollectionStyle.ANY;
+  final style;
 
   final Map _dartMap;
 
@@ -32,12 +32,17 @@
   @override
   Iterable get keys => _dartMap.keys;
 
-  YamlMapWrapper(Map dartMap, sourceUrl) : this._(dartMap, NullSpan(sourceUrl));
+  YamlMapWrapper(Map dartMap, sourceUrl,
+      {CollectionStyle style = CollectionStyle.ANY})
+      : this._(dartMap, NullSpan(sourceUrl), style: style);
 
-  YamlMapWrapper._(Map dartMap, SourceSpan span)
+  YamlMapWrapper._(Map dartMap, SourceSpan span,
+      {this.style = CollectionStyle.ANY})
       : _dartMap = dartMap,
         span = span,
-        nodes = _YamlMapNodes(dartMap, span);
+        nodes = _YamlMapNodes(dartMap, span) {
+    ArgumentError.checkNotNull(style, 'style');
+  }
 
   @override
   dynamic operator [](Object key) {
@@ -89,7 +94,7 @@
 /// A wrapper that makes a normal Dart list behave like a [YamlList].
 class YamlListWrapper extends ListBase implements YamlList {
   @override
-  final style = CollectionStyle.ANY;
+  final style;
 
   final List _dartList;
 
@@ -110,13 +115,17 @@
     throw UnsupportedError('Cannot modify an unmodifiable List.');
   }
 
-  YamlListWrapper(List dartList, sourceUrl)
-      : this._(dartList, NullSpan(sourceUrl));
+  YamlListWrapper(List dartList, sourceUrl,
+      {CollectionStyle style = CollectionStyle.ANY})
+      : this._(dartList, NullSpan(sourceUrl), style: style);
 
-  YamlListWrapper._(List dartList, SourceSpan span)
+  YamlListWrapper._(List dartList, SourceSpan span,
+      {this.style = CollectionStyle.ANY})
       : _dartList = dartList,
         span = span,
-        nodes = _YamlListNodes(dartList, span);
+        nodes = _YamlListNodes(dartList, span) {
+    ArgumentError.checkNotNull(style, 'style');
+  }
 
   @override
   dynamic operator [](int index) {
diff --git a/pubspec.yaml b/pubspec.yaml
index 0641a2d..31e5001 100644
--- a/pubspec.yaml
+++ b/pubspec.yaml
@@ -1,19 +1,19 @@
 name: yaml
-version: 2.2.1
+version: 2.3.0-dev
 
 description: A parser for YAML, a human-friendly data serialization standard
 homepage: https://github.com/dart-lang/yaml
 
 environment:
-  sdk: '>=2.4.0 <3.0.0'
+  sdk: ">=2.4.0 <3.0.0"
 
 dependencies:
   charcode: ^1.1.0
-  collection: '>=1.1.0 <2.0.0'
-  string_scanner: '>=0.1.4 <2.0.0'
-  source_span: '>=1.0.0 <2.0.0'
+  collection: ">=1.1.0 <2.0.0"
+  string_scanner: ">=0.1.4 <2.0.0"
+  source_span: ">=1.0.0 <2.0.0"
 
 dev_dependencies:
   pedantic: ^1.0.0
-  path: '>=1.2.0 <2.0.0'
-  test: '>=0.12.0 <2.0.0'
+  path: ">=1.2.0 <2.0.0"
+  test: ">=0.12.0 <2.0.0"
diff --git a/test/yaml_node_wrapper_test.dart b/test/yaml_node_wrapper_test.dart
index 9dc991e..d6da052 100644
--- a/test/yaml_node_wrapper_test.dart
+++ b/test/yaml_node_wrapper_test.dart
@@ -67,6 +67,11 @@
     expect(map.keys, unorderedEquals(['list', 'map', 'scalar']));
     expect(map.nodes.keys, everyElement(TypeMatcher<YamlScalar>()));
     expect(map.nodes[YamlScalar.wrap('list')], equals([1, 2, 3]));
+    expect(map.style, equals(CollectionStyle.ANY));
+    expect((map.nodes['list'] as YamlList).style, equals(CollectionStyle.ANY));
+    expect((map.nodes['map'] as YamlMap).style, equals(CollectionStyle.ANY));
+    expect((map['map'].nodes['nested'] as YamlList).style,
+        equals(CollectionStyle.ANY));
   });
 
   test('YamlMap.wrap() with a sourceUrl', () {
@@ -86,6 +91,23 @@
     expect(map.nodes['scalar'].span, isNullSpan(source));
   });
 
+  test('YamlMap.wrap() with a sourceUrl and style', () {
+    var map = YamlMap.wrap({
+      'list': [1, 2, 3],
+      'map': {
+        'foo': 'bar',
+        'nested': [4, 5, 6]
+      },
+      'scalar': 'value'
+    }, sourceUrl: 'source', style: CollectionStyle.BLOCK);
+
+    expect(map.style, equals(CollectionStyle.BLOCK));
+    expect((map.nodes['list'] as YamlList).style, equals(CollectionStyle.ANY));
+    expect((map.nodes['map'] as YamlMap).style, equals(CollectionStyle.ANY));
+    expect((map['map'].nodes['nested'] as YamlList).style,
+        equals(CollectionStyle.ANY));
+  });
+
   test('YamlList.wrap() with no sourceUrl', () {
     var list = YamlList.wrap([
       [1, 2, 3],
@@ -119,6 +141,10 @@
     expect(list.nodes[2].value, 'value');
     expect(list.nodes[2].span, isNullSpan(isNull));
     expect(list[2], 'value');
+    expect(list.style, equals(CollectionStyle.ANY));
+    expect((list[0] as YamlList).style, equals(CollectionStyle.ANY));
+    expect((list[1] as YamlMap).style, equals(CollectionStyle.ANY));
+    expect((list[1]['nested'] as YamlList).style, equals(CollectionStyle.ANY));
   });
 
   test('YamlList.wrap() with a sourceUrl', () {
@@ -129,12 +155,29 @@
         'nested': [4, 5, 6]
       },
       'value'
-    ]);
+    ], sourceUrl: 'source');
 
-    expect(list.span, isNullSpan(isNull));
-    expect(list[0].span, isNullSpan(isNull));
-    expect(list[1].span, isNullSpan(isNull));
-    expect(list.nodes[2].span, isNullSpan(isNull));
+    var source = Uri.parse('source');
+    expect(list.span, isNullSpan(source));
+    expect(list[0].span, isNullSpan(source));
+    expect(list[1].span, isNullSpan(source));
+    expect(list.nodes[2].span, isNullSpan(source));
+  });
+
+  test('YamlList.wrap() with a sourceUrl and style', () {
+    var list = YamlList.wrap([
+      [1, 2, 3],
+      {
+        'foo': 'bar',
+        'nested': [4, 5, 6]
+      },
+      'value'
+    ], sourceUrl: 'source', style: CollectionStyle.FLOW);
+
+    expect(list.style, equals(CollectionStyle.FLOW));
+    expect((list[0] as YamlList).style, equals(CollectionStyle.ANY));
+    expect((list[1] as YamlMap).style, equals(CollectionStyle.ANY));
+    expect((list[1]['nested'] as YamlList).style, equals(CollectionStyle.ANY));
   });
 
   test('re-wrapped objects equal one another', () {
@@ -150,6 +193,28 @@
     expect(list[1].nodes == list[1].nodes, isTrue);
     expect(list[1] == YamlMap.wrap({'foo': 'bar'}), isFalse);
   });
+
+  test('YamlScalar.wrap() with no sourceUrl', () {
+    var scalar = YamlScalar.wrap('foo');
+
+    expect(scalar.span, isNullSpan(isNull));
+    expect(scalar.value, 'foo');
+    expect(scalar.style, equals(ScalarStyle.ANY));
+  });
+
+  test('YamlScalar.wrap() with sourceUrl', () {
+    var scalar = YamlScalar.wrap('foo', sourceUrl: 'source');
+
+    var source = Uri.parse('source');
+    expect(scalar.span, isNullSpan(source));
+  });
+
+  test('YamlScalar.wrap() with sourceUrl and style', () {
+    var scalar = YamlScalar.wrap('foo',
+        sourceUrl: 'source', style: ScalarStyle.DOUBLE_QUOTED);
+
+    expect(scalar.style, equals(ScalarStyle.DOUBLE_QUOTED));
+  });
 }
 
 Matcher isNullSpan(sourceUrl) => predicate((span) {
