diff --git a/csharp/src/Google.Protobuf.Test/CodedInputStreamTest.cs b/csharp/src/Google.Protobuf.Test/CodedInputStreamTest.cs
index fa88d40..6e25fa3 100644
--- a/csharp/src/Google.Protobuf.Test/CodedInputStreamTest.cs
+++ b/csharp/src/Google.Protobuf.Test/CodedInputStreamTest.cs
@@ -59,20 +59,20 @@
         /// </summary>
         private static void AssertReadVarint(byte[] data, ulong value)
         {
-            CodedInputStream input = CodedInputStream.CreateInstance(data);
+            CodedInputStream input = new CodedInputStream(data);
             Assert.AreEqual((uint) value, input.ReadRawVarint32());
 
-            input = CodedInputStream.CreateInstance(data);
+            input = new CodedInputStream(data);
             Assert.AreEqual(value, input.ReadRawVarint64());
             Assert.IsTrue(input.IsAtEnd);
 
             // Try different block sizes.
             for (int bufferSize = 1; bufferSize <= 16; bufferSize *= 2)
             {
-                input = CodedInputStream.CreateInstance(new SmallBlockInputStream(data, bufferSize));
+                input = new CodedInputStream(new SmallBlockInputStream(data, bufferSize));
                 Assert.AreEqual((uint) value, input.ReadRawVarint32());
 
-                input = CodedInputStream.CreateInstance(new SmallBlockInputStream(data, bufferSize));
+                input = new CodedInputStream(new SmallBlockInputStream(data, bufferSize));
                 Assert.AreEqual(value, input.ReadRawVarint64());
                 Assert.IsTrue(input.IsAtEnd);
             }
@@ -95,11 +95,11 @@
         /// </summary>
         private static void AssertReadVarintFailure(InvalidProtocolBufferException expected, byte[] data)
         {
-            CodedInputStream input = CodedInputStream.CreateInstance(data);
+            CodedInputStream input = new CodedInputStream(data);
             var exception = Assert.Throws<InvalidProtocolBufferException>(() => input.ReadRawVarint32());
             Assert.AreEqual(expected.Message, exception.Message);
 
-            input = CodedInputStream.CreateInstance(data);
+            input = new CodedInputStream(data);
             exception = Assert.Throws<InvalidProtocolBufferException>(() => input.ReadRawVarint64());
             Assert.AreEqual(expected.Message, exception.Message);
 
@@ -152,14 +152,14 @@
         /// </summary>
         private static void AssertReadLittleEndian32(byte[] data, uint value)
         {
-            CodedInputStream input = CodedInputStream.CreateInstance(data);
+            CodedInputStream input = new CodedInputStream(data);
             Assert.AreEqual(value, input.ReadRawLittleEndian32());
             Assert.IsTrue(input.IsAtEnd);
 
             // Try different block sizes.
             for (int blockSize = 1; blockSize <= 16; blockSize *= 2)
             {
-                input = CodedInputStream.CreateInstance(
+                input = new CodedInputStream(
                     new SmallBlockInputStream(data, blockSize));
                 Assert.AreEqual(value, input.ReadRawLittleEndian32());
                 Assert.IsTrue(input.IsAtEnd);
@@ -172,14 +172,14 @@
         /// </summary>
         private static void AssertReadLittleEndian64(byte[] data, ulong value)
         {
-            CodedInputStream input = CodedInputStream.CreateInstance(data);
+            CodedInputStream input = new CodedInputStream(data);
             Assert.AreEqual(value, input.ReadRawLittleEndian64());
             Assert.IsTrue(input.IsAtEnd);
 
             // Try different block sizes.
             for (int blockSize = 1; blockSize <= 16; blockSize *= 2)
             {
-                input = CodedInputStream.CreateInstance(
+                input = new CodedInputStream(
                     new SmallBlockInputStream(data, blockSize));
                 Assert.AreEqual(value, input.ReadRawLittleEndian64());
                 Assert.IsTrue(input.IsAtEnd);
@@ -269,7 +269,7 @@
         public void ReadMaliciouslyLargeBlob()
         {
             MemoryStream ms = new MemoryStream();
-            CodedOutputStream output = CodedOutputStream.CreateInstance(ms);
+            CodedOutputStream output = new CodedOutputStream(ms);
 
             uint tag = WireFormat.MakeTag(1, WireFormat.WireType.LengthDelimited);
             output.WriteRawVarint32(tag);
@@ -278,7 +278,7 @@
             output.Flush();
             ms.Position = 0;
 
-            CodedInputStream input = CodedInputStream.CreateInstance(ms);
+            CodedInputStream input = new CodedInputStream(ms);
             uint testtag;
             Assert.IsTrue(input.ReadTag(out testtag));
             Assert.AreEqual(tag, testtag);
@@ -335,7 +335,7 @@
             // Have to use a Stream rather than ByteString.CreateCodedInput as SizeLimit doesn't
             // apply to the latter case.
             MemoryStream ms = new MemoryStream(TestUtil.GetAllSet().ToByteString().ToByteArray());
-            CodedInputStream input = CodedInputStream.CreateInstance(ms);
+            CodedInputStream input = new CodedInputStream(ms);
             input.SetSizeLimit(16);
 
             Assert.Throws<InvalidProtocolBufferException>(() => TestAllTypes.ParseFrom(input));
@@ -344,7 +344,7 @@
         [Test]
         public void ResetSizeCounter()
         {
-            CodedInputStream input = CodedInputStream.CreateInstance(
+            CodedInputStream input = new CodedInputStream(
                 new SmallBlockInputStream(new byte[256], 8));
             input.SetSizeLimit(16);
             input.ReadRawBytes(16);
@@ -366,7 +366,7 @@
         public void ReadInvalidUtf8()
         {
             MemoryStream ms = new MemoryStream();
-            CodedOutputStream output = CodedOutputStream.CreateInstance(ms);
+            CodedOutputStream output = new CodedOutputStream(ms);
 
             uint tag = WireFormat.MakeTag(1, WireFormat.WireType.LengthDelimited);
             output.WriteRawVarint32(tag);
@@ -375,7 +375,7 @@
             output.Flush();
             ms.Position = 0;
 
-            CodedInputStream input = CodedInputStream.CreateInstance(ms);
+            CodedInputStream input = new CodedInputStream(ms);
 
             uint actualTag;
             Assert.IsTrue(input.ReadTag(out actualTag));
@@ -409,7 +409,7 @@
         public void TestNegativeEnum()
         {
             byte[] bytes = { 0xFE, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x01 };
-            CodedInputStream input = CodedInputStream.CreateInstance(bytes);
+            CodedInputStream input = new CodedInputStream(bytes);
             Assert.AreEqual((int)SampleEnum.NegativeValue, input.ReadEnum());
             Assert.IsTrue(input.IsAtEnd);
         }
@@ -420,7 +420,7 @@
         {
             using (var ms = new MemoryStream())
             {
-                CodedOutputStream output = CodedOutputStream.CreateInstance(ms);
+                CodedOutputStream output = new CodedOutputStream(ms);
                 output.WriteTag(1, WireFormat.WireType.LengthDelimited);
                 output.WriteBytes(ByteString.CopyFrom(new byte[100]));
                 output.WriteTag(2, WireFormat.WireType.LengthDelimited);
@@ -428,7 +428,7 @@
                 output.Flush();
 
                 ms.Position = 0;
-                CodedInputStream input = CodedInputStream.CreateInstance(ms, new byte[ms.Length / 2]);
+                CodedInputStream input = new CodedInputStream(ms, new byte[ms.Length / 2]);
 
                 uint tag;
                 Assert.IsTrue(input.ReadTag(out tag));
diff --git a/csharp/src/Google.Protobuf.Test/CodedOutputStreamTest.cs b/csharp/src/Google.Protobuf.Test/CodedOutputStreamTest.cs
index c3d92a6..af32917 100644
--- a/csharp/src/Google.Protobuf.Test/CodedOutputStreamTest.cs
+++ b/csharp/src/Google.Protobuf.Test/CodedOutputStreamTest.cs
@@ -49,7 +49,7 @@
             if ((value >> 32) == 0)
             {
                 MemoryStream rawOutput = new MemoryStream();
-                CodedOutputStream output = CodedOutputStream.CreateInstance(rawOutput);
+                CodedOutputStream output = new CodedOutputStream(rawOutput);
                 output.WriteRawVarint32((uint) value);
                 output.Flush();
                 Assert.AreEqual(data, rawOutput.ToArray());
@@ -59,7 +59,7 @@
 
             {
                 MemoryStream rawOutput = new MemoryStream();
-                CodedOutputStream output = CodedOutputStream.CreateInstance(rawOutput);
+                CodedOutputStream output = new CodedOutputStream(rawOutput);
                 output.WriteRawVarint64(value);
                 output.Flush();
                 Assert.AreEqual(data, rawOutput.ToArray());
@@ -76,7 +76,7 @@
                 {
                     MemoryStream rawOutput = new MemoryStream();
                     CodedOutputStream output =
-                        CodedOutputStream.CreateInstance(rawOutput, bufferSize);
+                        new CodedOutputStream(rawOutput, bufferSize);
                     output.WriteRawVarint32((uint) value);
                     output.Flush();
                     Assert.AreEqual(data, rawOutput.ToArray());
@@ -84,7 +84,7 @@
 
                 {
                     MemoryStream rawOutput = new MemoryStream();
-                    CodedOutputStream output = CodedOutputStream.CreateInstance(rawOutput, bufferSize);
+                    CodedOutputStream output = new CodedOutputStream(rawOutput, bufferSize);
                     output.WriteRawVarint64(value);
                     output.Flush();
                     Assert.AreEqual(data, rawOutput.ToArray());
@@ -134,7 +134,7 @@
         private static void AssertWriteLittleEndian32(byte[] data, uint value)
         {
             MemoryStream rawOutput = new MemoryStream();
-            CodedOutputStream output = CodedOutputStream.CreateInstance(rawOutput);
+            CodedOutputStream output = new CodedOutputStream(rawOutput);
             output.WriteRawLittleEndian32(value);
             output.Flush();
             Assert.AreEqual(data, rawOutput.ToArray());
@@ -143,7 +143,7 @@
             for (int bufferSize = 1; bufferSize <= 16; bufferSize *= 2)
             {
                 rawOutput = new MemoryStream();
-                output = CodedOutputStream.CreateInstance(rawOutput, bufferSize);
+                output = new CodedOutputStream(rawOutput, bufferSize);
                 output.WriteRawLittleEndian32(value);
                 output.Flush();
                 Assert.AreEqual(data, rawOutput.ToArray());
@@ -157,7 +157,7 @@
         private static void AssertWriteLittleEndian64(byte[] data, ulong value)
         {
             MemoryStream rawOutput = new MemoryStream();
-            CodedOutputStream output = CodedOutputStream.CreateInstance(rawOutput);
+            CodedOutputStream output = new CodedOutputStream(rawOutput);
             output.WriteRawLittleEndian64(value);
             output.Flush();
             Assert.AreEqual(data, rawOutput.ToArray());
@@ -166,7 +166,7 @@
             for (int blockSize = 1; blockSize <= 16; blockSize *= 2)
             {
                 rawOutput = new MemoryStream();
-                output = CodedOutputStream.CreateInstance(rawOutput, blockSize);
+                output = new CodedOutputStream(rawOutput, blockSize);
                 output.WriteRawLittleEndian64(value);
                 output.Flush();
                 Assert.AreEqual(data, rawOutput.ToArray());
@@ -201,7 +201,7 @@
             for (int blockSize = 1; blockSize < 256; blockSize *= 2)
             {
                 MemoryStream rawOutput = new MemoryStream();
-                CodedOutputStream output = CodedOutputStream.CreateInstance(rawOutput, blockSize);
+                CodedOutputStream output = new CodedOutputStream(rawOutput, blockSize);
                 message.WriteTo(output);
                 output.Flush();
                 Assert.AreEqual(rawBytes, rawOutput.ToArray());
@@ -276,7 +276,7 @@
             Assert.AreEqual(10, CodedOutputStream.ComputeEnumSize((int) SampleEnum.NegativeValue));
 
             byte[] bytes = new byte[10];
-            CodedOutputStream output = CodedOutputStream.CreateInstance(bytes);
+            CodedOutputStream output = new CodedOutputStream(bytes);
             output.WriteEnum((int) SampleEnum.NegativeValue);
 
             Assert.AreEqual(0, output.SpaceLeft);
@@ -293,7 +293,7 @@
             byte[] child = new byte[120];
             {
                 MemoryStream ms = new MemoryStream(child);
-                CodedOutputStream cout = CodedOutputStream.CreateInstance(ms, 20);
+                CodedOutputStream cout = new CodedOutputStream(ms, 20);
                 // Field 11: numeric value: 500
                 cout.WriteTag(11, WireFormat.WireType.Varint);
                 Assert.AreEqual(1, cout.Position);
@@ -314,7 +314,7 @@
 
             byte[] bytes = new byte[130];
             {
-                CodedOutputStream cout = CodedOutputStream.CreateInstance(bytes);
+                CodedOutputStream cout = new CodedOutputStream(bytes);
                 // Field 1: numeric value: 500
                 cout.WriteTag(1, WireFormat.WireType.Varint);
                 Assert.AreEqual(1, cout.Position);
@@ -334,7 +334,7 @@
             }
             // Now test Input stream:
             {
-                CodedInputStream cin = CodedInputStream.CreateInstance(new MemoryStream(bytes), new byte[50]);
+                CodedInputStream cin = new CodedInputStream(new MemoryStream(bytes), new byte[50]);
                 uint tag;
                 Assert.AreEqual(0, cin.Position);
                 // Field 1:
diff --git a/csharp/src/Google.Protobuf.Test/Collections/RepeatedFieldTest.cs b/csharp/src/Google.Protobuf.Test/Collections/RepeatedFieldTest.cs
index 33c4e10..322100d 100644
--- a/csharp/src/Google.Protobuf.Test/Collections/RepeatedFieldTest.cs
+++ b/csharp/src/Google.Protobuf.Test/Collections/RepeatedFieldTest.cs
@@ -221,7 +221,7 @@
         {
             uint packedTag = WireFormat.MakeTag(10, WireFormat.WireType.LengthDelimited);
             var stream = new MemoryStream();
-            var output = CodedOutputStream.CreateInstance(stream);
+            var output = new CodedOutputStream(stream);
             var length = CodedOutputStream.ComputeInt32Size(10)
                 + CodedOutputStream.ComputeInt32Size(999)
                 + CodedOutputStream.ComputeInt32Size(-1000);
@@ -237,7 +237,7 @@
             // actually packed.
             uint nonPackedTag = WireFormat.MakeTag(10, WireFormat.WireType.LengthDelimited);
             var field = new RepeatedField<int>();
-            var input = CodedInputStream.CreateInstance(stream);
+            var input = new CodedInputStream(stream);
             input.AssertNextTag(packedTag);
             field.AddEntriesFrom(input, FieldCodec.ForInt32(nonPackedTag));
             CollectionAssert.AreEqual(new[] { 10, 999, -1000 }, field);
@@ -249,7 +249,7 @@
         {
             uint nonPackedTag = WireFormat.MakeTag(10, WireFormat.WireType.Varint);
             var stream = new MemoryStream();
-            var output = CodedOutputStream.CreateInstance(stream);
+            var output = new CodedOutputStream(stream);
             output.WriteTag(nonPackedTag);
             output.WriteInt32(10);
             output.WriteTag(nonPackedTag);
@@ -263,7 +263,7 @@
             // actually not packed.
             uint packedTag = WireFormat.MakeTag(10, WireFormat.WireType.LengthDelimited);
             var field = new RepeatedField<int>();
-            var input = CodedInputStream.CreateInstance(stream);
+            var input = new CodedInputStream(stream);
             input.AssertNextTag(nonPackedTag);
             field.AddEntriesFrom(input, FieldCodec.ForInt32(packedTag));
             CollectionAssert.AreEqual(new[] { 10, 999, -1000 }, field);
@@ -275,7 +275,7 @@
         {
             uint tag = WireFormat.MakeTag(10, WireFormat.WireType.LengthDelimited);
             var stream = new MemoryStream();
-            var output = CodedOutputStream.CreateInstance(stream);
+            var output = new CodedOutputStream(stream);
             output.WriteTag(tag);
             output.WriteString("Foo");
             output.WriteTag(tag);
@@ -286,7 +286,7 @@
             stream.Position = 0;
 
             var field = new RepeatedField<string>();
-            var input = CodedInputStream.CreateInstance(stream);
+            var input = new CodedInputStream(stream);
             input.AssertNextTag(tag);
             field.AddEntriesFrom(input, FieldCodec.ForString(tag));
             CollectionAssert.AreEqual(new[] { "Foo", "", "Bar" }, field);
@@ -301,7 +301,7 @@
 
             uint tag = WireFormat.MakeTag(10, WireFormat.WireType.LengthDelimited);
             var stream = new MemoryStream();
-            var output = CodedOutputStream.CreateInstance(stream);
+            var output = new CodedOutputStream(stream);
             output.WriteTag(tag);
             output.WriteMessage(message1);
             output.WriteTag(tag);
@@ -310,7 +310,7 @@
             stream.Position = 0;
 
             var field = new RepeatedField<ForeignMessage>();
-            var input = CodedInputStream.CreateInstance(stream);
+            var input = new CodedInputStream(stream);
             input.AssertNextTag(tag);
             field.AddEntriesFrom(input, FieldCodec.ForMessage(tag, ForeignMessage.Parser));
             CollectionAssert.AreEqual(new[] { message1, message2}, field);
@@ -323,12 +323,12 @@
             uint tag = WireFormat.MakeTag(10, WireFormat.WireType.LengthDelimited);
             var field = new RepeatedField<int> { 10, 1000, 1000000 };
             var stream = new MemoryStream();
-            var output = CodedOutputStream.CreateInstance(stream);
+            var output = new CodedOutputStream(stream);
             field.WriteTo(output, FieldCodec.ForInt32(tag));
             output.Flush();
             stream.Position = 0;
 
-            var input = CodedInputStream.CreateInstance(stream);
+            var input = new CodedInputStream(stream);
             input.AssertNextTag(tag);
             var length = input.ReadLength();
             Assert.AreEqual(10, input.ReadInt32());
@@ -344,12 +344,12 @@
             uint tag = WireFormat.MakeTag(10, WireFormat.WireType.Varint);
             var field = new RepeatedField<int> { 10, 1000, 1000000};
             var stream = new MemoryStream();
-            var output = CodedOutputStream.CreateInstance(stream);
+            var output = new CodedOutputStream(stream);
             field.WriteTo(output, FieldCodec.ForInt32(tag));
             output.Flush();
             stream.Position = 0;
 
-            var input = CodedInputStream.CreateInstance(stream);
+            var input = new CodedInputStream(stream);
             input.AssertNextTag(tag);
             Assert.AreEqual(10, input.ReadInt32());
             input.AssertNextTag(tag);
@@ -365,12 +365,12 @@
             uint tag = WireFormat.MakeTag(10, WireFormat.WireType.LengthDelimited);
             var field = new RepeatedField<string> { "Foo", "", "Bar" };
             var stream = new MemoryStream();
-            var output = CodedOutputStream.CreateInstance(stream);
+            var output = new CodedOutputStream(stream);
             field.WriteTo(output, FieldCodec.ForString(tag));
             output.Flush();
             stream.Position = 0;
 
-            var input = CodedInputStream.CreateInstance(stream);
+            var input = new CodedInputStream(stream);
             input.AssertNextTag(tag);
             Assert.AreEqual("Foo", input.ReadString());
             input.AssertNextTag(tag);
@@ -388,12 +388,12 @@
             uint tag = WireFormat.MakeTag(10, WireFormat.WireType.LengthDelimited);
             var field = new RepeatedField<ForeignMessage> { message1, message2 };
             var stream = new MemoryStream();
-            var output = CodedOutputStream.CreateInstance(stream);
+            var output = new CodedOutputStream(stream);
             field.WriteTo(output, FieldCodec.ForMessage(tag, ForeignMessage.Parser));
             output.Flush();
             stream.Position = 0;
 
-            var input = CodedInputStream.CreateInstance(stream);
+            var input = new CodedInputStream(stream);
             input.AssertNextTag(tag);
             Assert.AreEqual(message1, input.ReadMessage(ForeignMessage.Parser));
             input.AssertNextTag(tag);
@@ -444,7 +444,7 @@
             int arraySize = 1 + 1 + (11 * 5);
             int msgSize = arraySize;
             byte[] bytes = new byte[msgSize];
-            CodedOutputStream output = CodedOutputStream.CreateInstance(bytes);
+            CodedOutputStream output = new CodedOutputStream(bytes);
             uint tag = WireFormat.MakeTag(8, WireFormat.WireType.Varint);
             for (int i = 0; i >= -5; i--)
             {
@@ -454,7 +454,7 @@
 
             Assert.AreEqual(0, output.SpaceLeft);
 
-            CodedInputStream input = CodedInputStream.CreateInstance(bytes);
+            CodedInputStream input = new CodedInputStream(bytes);
             Assert.IsTrue(input.ReadTag(out tag));
 
             RepeatedField<SampleEnum> values = new RepeatedField<SampleEnum>();
@@ -476,7 +476,7 @@
             int arraySize = 1 + (10 * 5);
             int msgSize = 1 + 1 + arraySize;
             byte[] bytes = new byte[msgSize];
-            CodedOutputStream output = CodedOutputStream.CreateInstance(bytes);
+            CodedOutputStream output = new CodedOutputStream(bytes);
             // Length-delimited to show we want the packed representation
             uint tag = WireFormat.MakeTag(8, WireFormat.WireType.LengthDelimited);
             output.WriteTag(tag);
@@ -492,7 +492,7 @@
             }
             Assert.AreEqual(0, output.SpaceLeft);
 
-            CodedInputStream input = CodedInputStream.CreateInstance(bytes);
+            CodedInputStream input = new CodedInputStream(bytes);
             Assert.IsTrue(input.ReadTag(out tag));
 
             RepeatedField<SampleEnum> values = new RepeatedField<SampleEnum>();
diff --git a/csharp/src/Google.Protobuf.Test/FieldCodecTest.cs b/csharp/src/Google.Protobuf.Test/FieldCodecTest.cs
index c6ed2a2..6f145a4 100644
--- a/csharp/src/Google.Protobuf.Test/FieldCodecTest.cs
+++ b/csharp/src/Google.Protobuf.Test/FieldCodecTest.cs
@@ -120,11 +120,11 @@
             public void TestRoundTripRaw()
             {
                 var stream = new MemoryStream();
-                var codedOutput = CodedOutputStream.CreateInstance(stream);
+                var codedOutput = new CodedOutputStream(stream);
                 codec.ValueWriter(codedOutput, sampleValue);
                 codedOutput.Flush();
                 stream.Position = 0;
-                var codedInput = CodedInputStream.CreateInstance(stream);
+                var codedInput = new CodedInputStream(stream);
                 Assert.AreEqual(sampleValue, codec.ValueReader(codedInput));
                 Assert.IsTrue(codedInput.IsAtEnd);
             }
@@ -132,11 +132,11 @@
             public void TestRoundTripWithTag()
             {
                 var stream = new MemoryStream();
-                var codedOutput = CodedOutputStream.CreateInstance(stream);
+                var codedOutput = new CodedOutputStream(stream);
                 codec.WriteTagAndValue(codedOutput, sampleValue);
                 codedOutput.Flush();
                 stream.Position = 0;
-                var codedInput = CodedInputStream.CreateInstance(stream);
+                var codedInput = new CodedInputStream(stream);
                 codedInput.AssertNextTag(codec.Tag);
                 Assert.AreEqual(sampleValue, codec.Read(codedInput));
                 Assert.IsTrue(codedInput.IsAtEnd);
@@ -145,7 +145,7 @@
             public void TestCalculateSizeWithTag()
             {
                 var stream = new MemoryStream();
-                var codedOutput = CodedOutputStream.CreateInstance(stream);
+                var codedOutput = new CodedOutputStream(stream);
                 codec.WriteTagAndValue(codedOutput, sampleValue);
                 codedOutput.Flush();
                 Assert.AreEqual(stream.Position, codec.CalculateSizeWithTag(sampleValue));
@@ -155,7 +155,7 @@
             {
                 // WriteTagAndValue ignores default values
                 var stream = new MemoryStream();
-                var codedOutput = CodedOutputStream.CreateInstance(stream);
+                var codedOutput = new CodedOutputStream(stream);
                 codec.WriteTagAndValue(codedOutput, codec.DefaultValue);
                 codedOutput.Flush();
                 Assert.AreEqual(0, stream.Position);
@@ -168,13 +168,13 @@
                 // The plain ValueWriter/ValueReader delegates don't.
                 if (codec.DefaultValue != null) // This part isn't appropriate for message types.
                 {
-                    codedOutput = CodedOutputStream.CreateInstance(stream);
+                    codedOutput = new CodedOutputStream(stream);
                     codec.ValueWriter(codedOutput, codec.DefaultValue);
                     codedOutput.Flush();
                     Assert.AreNotEqual(0, stream.Position);
                     Assert.AreEqual(stream.Position, codec.ValueSizeCalculator(codec.DefaultValue));
                     stream.Position = 0;
-                    var codedInput = CodedInputStream.CreateInstance(stream);
+                    var codedInput = new CodedInputStream(stream);
                     Assert.AreEqual(codec.DefaultValue, codec.ValueReader(codedInput));
                 }
             }
diff --git a/csharp/src/Google.Protobuf.Test/GeneratedMessageTest.cs b/csharp/src/Google.Protobuf.Test/GeneratedMessageTest.cs
index 140b878..2b6265c 100644
--- a/csharp/src/Google.Protobuf.Test/GeneratedMessageTest.cs
+++ b/csharp/src/Google.Protobuf.Test/GeneratedMessageTest.cs
@@ -253,7 +253,7 @@
         {
             // Hand-craft the stream to contain a single entry with just a value.
             var memoryStream = new MemoryStream();
-            var output = CodedOutputStream.CreateInstance(memoryStream);
+            var output = new CodedOutputStream(memoryStream);
             output.WriteTag(TestMap.MapInt32ForeignMessageFieldNumber, WireFormat.WireType.LengthDelimited);
             var nestedMessage = new ForeignMessage { C = 20 };
             // Size of the entry (tag, size written by WriteMessage, data written by WriteMessage)
@@ -271,7 +271,7 @@
         {
             // Hand-craft the stream to contain a single entry with three fields
             var memoryStream = new MemoryStream();
-            var output = CodedOutputStream.CreateInstance(memoryStream);
+            var output = new CodedOutputStream(memoryStream);
 
             output.WriteTag(TestMap.MapInt32Int32FieldNumber, WireFormat.WireType.LengthDelimited);
 
@@ -298,7 +298,7 @@
         public void MapFieldOrderIsIrrelevant()
         {
             var memoryStream = new MemoryStream();
-            var output = CodedOutputStream.CreateInstance(memoryStream);
+            var output = new CodedOutputStream(memoryStream);
 
             output.WriteTag(TestMap.MapInt32Int32FieldNumber, WireFormat.WireType.LengthDelimited);
 
@@ -322,7 +322,7 @@
         public void MapNonContiguousEntries()
         {
             var memoryStream = new MemoryStream();
-            var output = CodedOutputStream.CreateInstance(memoryStream);
+            var output = new CodedOutputStream(memoryStream);
 
             // Message structure:
             // Entry for MapInt32Int32
@@ -373,7 +373,7 @@
         public void DuplicateKeys_LastEntryWins()
         {
             var memoryStream = new MemoryStream();
-            var output = CodedOutputStream.CreateInstance(memoryStream);
+            var output = new CodedOutputStream(memoryStream);
 
             var key = 10;
             var value1 = 20;
diff --git a/csharp/src/Google.Protobuf.Test/TestCornerCases.cs b/csharp/src/Google.Protobuf.Test/TestCornerCases.cs
index b270a6f..03fa185 100644
--- a/csharp/src/Google.Protobuf.Test/TestCornerCases.cs
+++ b/csharp/src/Google.Protobuf.Test/TestCornerCases.cs
@@ -50,7 +50,7 @@
             Assert.AreEqual(58, msg.CalculateSize());
 
             byte[] bytes = new byte[58];
-            CodedOutputStream output = CodedOutputStream.CreateInstance(bytes);
+            CodedOutputStream output = new CodedOutputStream(bytes);
 
             msg.WriteTo(output);
             Assert.AreEqual(0, output.SpaceLeft);
diff --git a/csharp/src/Google.Protobuf.Test/WellKnownTypes/WrappersTest.cs b/csharp/src/Google.Protobuf.Test/WellKnownTypes/WrappersTest.cs
index 670bc5f..d2a0705 100644
--- a/csharp/src/Google.Protobuf.Test/WellKnownTypes/WrappersTest.cs
+++ b/csharp/src/Google.Protobuf.Test/WellKnownTypes/WrappersTest.cs
@@ -309,7 +309,7 @@
             var valueTag = WireFormat.MakeTag(Int32Value.ValueFieldNumber, WireFormat.WireType.Varint);
             using (var stream = new MemoryStream())
             {
-                var coded = CodedOutputStream.CreateInstance(stream);
+                var coded = new CodedOutputStream(stream);
                 coded.WriteTag(wrapperTag);
                 coded.WriteLength(2); // valueTag + a value 0, each one byte
                 coded.WriteTag(valueTag);
diff --git a/csharp/src/Google.Protobuf/ByteString.cs b/csharp/src/Google.Protobuf/ByteString.cs
index 329f47f..cf5468d 100644
--- a/csharp/src/Google.Protobuf/ByteString.cs
+++ b/csharp/src/Google.Protobuf/ByteString.cs
@@ -203,7 +203,7 @@
         public CodedInputStream CreateCodedInput()
         {
             // We trust CodedInputStream not to reveal the provided byte array or modify it
-            return CodedInputStream.CreateInstance(bytes);
+            return new CodedInputStream(bytes);
         }
 
         public static bool operator ==(ByteString lhs, ByteString rhs)
diff --git a/csharp/src/Google.Protobuf/CodedInputStream.cs b/csharp/src/Google.Protobuf/CodedInputStream.cs
index ef7cf11..f2e1d66 100644
--- a/csharp/src/Google.Protobuf/CodedInputStream.cs
+++ b/csharp/src/Google.Protobuf/CodedInputStream.cs
@@ -93,43 +93,19 @@
         private int sizeLimit = DefaultSizeLimit;
 
         #region Construction
-
-        /// <summary>
-        /// Creates a new CodedInputStream reading data from the given
-        /// stream.
-        /// </summary>
-        public static CodedInputStream CreateInstance(Stream input)
-        {
-            return new CodedInputStream(input);
-        }
-        /// <summary>
-        /// Creates a new CodedInputStream reading data from the given
-        /// stream and a pre-allocated memory buffer.
-        /// </summary>
-        public static CodedInputStream CreateInstance(Stream input, byte[] buffer)
-        {
-            return new CodedInputStream(input, buffer);
-        }
-
         /// <summary>
         /// Creates a new CodedInputStream reading data from the given
         /// byte array.
         /// </summary>
-        public static CodedInputStream CreateInstance(byte[] buf)
+        public CodedInputStream(byte[] buf) : this(buf, 0, buf.Length)
         {
-            return new CodedInputStream(buf, 0, buf.Length);
         }
 
         /// <summary>
         /// Creates a new CodedInputStream that reads from the given
         /// byte array slice.
         /// </summary>
-        public static CodedInputStream CreateInstance(byte[] buf, int offset, int length)
-        {
-            return new CodedInputStream(buf, offset, length);
-        }
-
-        private CodedInputStream(byte[] buffer, int offset, int length)
+        public CodedInputStream(byte[] buffer, int offset, int length)
         {
             this.buffer = buffer;
             this.bufferPos = offset;
@@ -137,14 +113,21 @@
             this.input = null;
         }
 
-        private CodedInputStream(Stream input)
+        /// <summary>
+        /// Creates a new CodedInputStream reading data from the given stream.
+        /// </summary>
+        public CodedInputStream(Stream input)
         {
             this.buffer = new byte[BufferSize];
             this.bufferSize = 0;
             this.input = input;
         }
 
-        private CodedInputStream(Stream input, byte[] buffer)
+        /// <summary>
+        /// Creates a new CodedInputStream reading data from the given
+        /// stream, with a pre-allocated buffer.
+        /// </summary>
+        internal CodedInputStream(Stream input, byte[] buffer)
         {
             this.buffer = buffer;
             this.bufferSize = 0;
diff --git a/csharp/src/Google.Protobuf/CodedOutputStream.cs b/csharp/src/Google.Protobuf/CodedOutputStream.cs
index b91d6d7..b084c14 100644
--- a/csharp/src/Google.Protobuf/CodedOutputStream.cs
+++ b/csharp/src/Google.Protobuf/CodedOutputStream.cs
@@ -65,7 +65,20 @@
         private readonly Stream output;
 
         #region Construction
+        /// <summary>
+        /// Creates a new CodedOutputStream that writes directly to the given
+        /// byte array. If more bytes are written than fit in the array,
+        /// OutOfSpaceException will be thrown.
+        /// </summary>
+        public CodedOutputStream(byte[] flatArray) : this(flatArray, 0, flatArray.Length)
+        {
+        }
 
+        /// <summary>
+        /// Creates a new CodedOutputStream that writes directly to the given
+        /// byte array slice. If more bytes are written than fit in the array,
+        /// OutOfSpaceException will be thrown.
+        /// </summary>
         private CodedOutputStream(byte[] buffer, int offset, int length)
         {
             this.output = null;
@@ -85,40 +98,17 @@
         /// <summary>
         /// Creates a new CodedOutputStream which write to the given stream.
         /// </summary>
-        public static CodedOutputStream CreateInstance(Stream output)
+        public CodedOutputStream(Stream output) : this(output, DefaultBufferSize)
         {
-            return CreateInstance(output, DefaultBufferSize);
         }
 
         /// <summary>
         /// Creates a new CodedOutputStream which write to the given stream and uses
         /// the specified buffer size.
         /// </summary>
-        public static CodedOutputStream CreateInstance(Stream output, int bufferSize)
+        public CodedOutputStream(Stream output, int bufferSize) : this(output, new byte[bufferSize])
         {
-            return new CodedOutputStream(output, new byte[bufferSize]);
-        }
-
-        /// <summary>
-        /// Creates a new CodedOutputStream that writes directly to the given
-        /// byte array. If more bytes are written than fit in the array,
-        /// OutOfSpaceException will be thrown.
-        /// </summary>
-        public static CodedOutputStream CreateInstance(byte[] flatArray)
-        {
-            return CreateInstance(flatArray, 0, flatArray.Length);
-        }
-
-        /// <summary>
-        /// Creates a new CodedOutputStream that writes directly to the given
-        /// byte array slice. If more bytes are written than fit in the array,
-        /// OutOfSpaceException will be thrown.
-        /// </summary>
-        public static CodedOutputStream CreateInstance(byte[] flatArray, int offset, int length)
-        {
-            return new CodedOutputStream(flatArray, offset, length);
-        }
-
+        }    
         #endregion
 
         /// <summary>
diff --git a/csharp/src/Google.Protobuf/MessageExtensions.cs b/csharp/src/Google.Protobuf/MessageExtensions.cs
index 7bd7993..6e7d47b 100644
--- a/csharp/src/Google.Protobuf/MessageExtensions.cs
+++ b/csharp/src/Google.Protobuf/MessageExtensions.cs
@@ -43,7 +43,7 @@
         {
             Preconditions.CheckNotNull(message, "message");
             Preconditions.CheckNotNull(data, "data");
-            CodedInputStream input = CodedInputStream.CreateInstance(data);
+            CodedInputStream input = new CodedInputStream(data);
             message.MergeFrom(input);
             input.CheckLastTagWas(0);
         }
@@ -61,7 +61,7 @@
         {
             Preconditions.CheckNotNull(message, "message");
             Preconditions.CheckNotNull(input, "input");
-            CodedInputStream codedInput = CodedInputStream.CreateInstance(input);
+            CodedInputStream codedInput = new CodedInputStream(input);
             message.MergeFrom(codedInput);
             codedInput.CheckLastTagWas(0);
         }
@@ -79,7 +79,7 @@
         {
             Preconditions.CheckNotNull(message, "message");
             byte[] result = new byte[message.CalculateSize()];
-            CodedOutputStream output = CodedOutputStream.CreateInstance(result);
+            CodedOutputStream output = new CodedOutputStream(result);
             message.WriteTo(output);
             output.CheckNoSpaceLeft();
             return result;
@@ -89,7 +89,7 @@
         {
             Preconditions.CheckNotNull(message, "message");
             Preconditions.CheckNotNull(output, "output");
-            CodedOutputStream codedOutput = CodedOutputStream.CreateInstance(output);
+            CodedOutputStream codedOutput = new CodedOutputStream(output);
             message.WriteTo(codedOutput);
             codedOutput.Flush();
         }
@@ -98,7 +98,7 @@
         {
             Preconditions.CheckNotNull(message, "message");
             Preconditions.CheckNotNull(output, "output");
-            CodedOutputStream codedOutput = CodedOutputStream.CreateInstance(output);
+            CodedOutputStream codedOutput = new CodedOutputStream(output);
             codedOutput.WriteRawVarint32((uint)message.CalculateSize());
             message.WriteTo(codedOutput);
             codedOutput.Flush();
diff --git a/csharp/src/Google.Protobuf/Properties/AssemblyInfo.cs b/csharp/src/Google.Protobuf/Properties/AssemblyInfo.cs
index 73a78b0..9a484ad 100644
--- a/csharp/src/Google.Protobuf/Properties/AssemblyInfo.cs
+++ b/csharp/src/Google.Protobuf/Properties/AssemblyInfo.cs
@@ -32,6 +32,7 @@
 
 using System.Reflection;
 using System.Runtime.CompilerServices;
+using System.Security;
 
 // General Information about an assembly is controlled through the following 
 // set of attributes. Change these attribute values to modify the information
@@ -45,6 +46,7 @@
 [assembly: AssemblyCopyright("Copyright ©  2015")]
 [assembly: AssemblyTrademark("")]
 [assembly: AssemblyCulture("")]
+[assembly: AllowPartiallyTrustedCallers]
 
 #if SIGNED
 [assembly: InternalsVisibleTo("Google.Protobuf.Test, PublicKey=" +
