diff --git a/packages/pigeon/CHANGELOG.md b/packages/pigeon/CHANGELOG.md
index 5e32c04..1ae9408 100644
--- a/packages/pigeon/CHANGELOG.md
+++ b/packages/pigeon/CHANGELOG.md
@@ -1,3 +1,7 @@
+## 4.2.2
+
+* Removes unneeded custom codecs for all languages.
+
 ## 4.2.1
 
 * Adds documentation comment support for Kotlin.
diff --git a/packages/pigeon/lib/cpp_generator.dart b/packages/pigeon/lib/cpp_generator.dart
index ec1b227..9c369a5 100644
--- a/packages/pigeon/lib/cpp_generator.dart
+++ b/packages/pigeon/lib/cpp_generator.dart
@@ -14,6 +14,9 @@
 const DocumentCommentSpecification _docCommentSpec =
     DocumentCommentSpecification(_commentPrefix);
 
+/// The default serializer for Flutter.
+const String _defaultCodecSerializer = 'flutter::StandardCodecSerializer';
+
 /// Options that control how C++ code will be generated.
 class CppOptions {
   /// Creates a [CppOptions] object
@@ -61,83 +64,80 @@
   }
 }
 
-String _getCodecName(Api api) => '${api.name}CodecSerializer';
+String _getCodecSerializerName(Api api) => '${api.name}CodecSerializer';
 
 const String _pointerPrefix = 'pointer';
 const String _encodablePrefix = 'encodable';
 
 void _writeCodecHeader(Indent indent, Api api, Root root) {
-  final String codecName = _getCodecName(api);
-  indent.write('class $codecName : public flutter::StandardCodecSerializer ');
+  assert(getCodecClasses(api, root).isNotEmpty);
+  final String codeSerializerName = _getCodecSerializerName(api);
+  indent.write('class $codeSerializerName : public $_defaultCodecSerializer ');
   indent.scoped('{', '};', () {
     indent.scoped(' public:', '', () {
       indent.writeln('');
       indent.format('''
-inline static $codecName& GetInstance() {
-\tstatic $codecName sInstance;
+inline static $codeSerializerName& GetInstance() {
+\tstatic $codeSerializerName sInstance;
 \treturn sInstance;
 }
 ''');
-      indent.writeln('$codecName();');
+      indent.writeln('$codeSerializerName();');
     });
-    if (getCodecClasses(api, root).isNotEmpty) {
-      indent.writeScoped(' public:', '', () {
-        indent.writeln(
-            'void WriteValue(const flutter::EncodableValue& value, flutter::ByteStreamWriter* stream) const override;');
-      });
-      indent.writeScoped(' protected:', '', () {
-        indent.writeln(
-            'flutter::EncodableValue ReadValueOfType(uint8_t type, flutter::ByteStreamReader* stream) const override;');
-      });
-    }
+    indent.writeScoped(' public:', '', () {
+      indent.writeln(
+          'void WriteValue(const flutter::EncodableValue& value, flutter::ByteStreamWriter* stream) const override;');
+    });
+    indent.writeScoped(' protected:', '', () {
+      indent.writeln(
+          'flutter::EncodableValue ReadValueOfType(uint8_t type, flutter::ByteStreamReader* stream) const override;');
+    });
   }, nestCount: 0);
 }
 
 void _writeCodecSource(Indent indent, Api api, Root root) {
-  final String codecName = _getCodecName(api);
-  indent.writeln('$codecName::$codecName() {}');
-  if (getCodecClasses(api, root).isNotEmpty) {
-    indent.write(
-        'flutter::EncodableValue $codecName::ReadValueOfType(uint8_t type, flutter::ByteStreamReader* stream) const ');
+  assert(getCodecClasses(api, root).isNotEmpty);
+  final String codeSerializerName = _getCodecSerializerName(api);
+  indent.writeln('$codeSerializerName::$codeSerializerName() {}');
+  indent.write(
+      'flutter::EncodableValue $codeSerializerName::ReadValueOfType(uint8_t type, flutter::ByteStreamReader* stream) const ');
+  indent.scoped('{', '}', () {
+    indent.write('switch (type) ');
     indent.scoped('{', '}', () {
-      indent.write('switch (type) ');
-      indent.scoped('{', '}', () {
-        for (final EnumeratedClass customClass in getCodecClasses(api, root)) {
-          indent.write('case ${customClass.enumeration}:');
-          indent.writeScoped('', '', () {
-            indent.writeln(
-                'return flutter::CustomEncodableValue(${customClass.name}(std::get<flutter::EncodableMap>(ReadValue(stream))));');
-          });
-        }
-        indent.write('default:');
+      for (final EnumeratedClass customClass in getCodecClasses(api, root)) {
+        indent.write('case ${customClass.enumeration}:');
         indent.writeScoped('', '', () {
           indent.writeln(
-              'return flutter::StandardCodecSerializer::ReadValueOfType(type, stream);');
-        }, addTrailingNewline: false);
-      });
+              'return flutter::CustomEncodableValue(${customClass.name}(std::get<flutter::EncodableMap>(ReadValue(stream))));');
+        });
+      }
+      indent.write('default:');
+      indent.writeScoped('', '', () {
+        indent.writeln(
+            'return $_defaultCodecSerializer::ReadValueOfType(type, stream);');
+      }, addTrailingNewline: false);
     });
-    indent.writeln('');
+  });
+  indent.writeln('');
+  indent.write(
+      'void $codeSerializerName::WriteValue(const flutter::EncodableValue& value, flutter::ByteStreamWriter* stream) const ');
+  indent.writeScoped('{', '}', () {
     indent.write(
-        'void $codecName::WriteValue(const flutter::EncodableValue& value, flutter::ByteStreamWriter* stream) const ');
-    indent.writeScoped('{', '}', () {
-      indent.write(
-          'if (const flutter::CustomEncodableValue* custom_value = std::get_if<flutter::CustomEncodableValue>(&value)) ');
-      indent.scoped('{', '}', () {
-        for (final EnumeratedClass customClass in getCodecClasses(api, root)) {
-          indent.write(
-              'if (custom_value->type() == typeid(${customClass.name})) ');
-          indent.scoped('{', '}', () {
-            indent.writeln('stream->WriteByte(${customClass.enumeration});');
-            indent.writeln(
-                'WriteValue(std::any_cast<${customClass.name}>(*custom_value).ToEncodableMap(), stream);');
-            indent.writeln('return;');
-          });
-        }
-      });
-      indent.writeln(
-          'flutter::StandardCodecSerializer::WriteValue(value, stream);');
+        'if (const flutter::CustomEncodableValue* custom_value = std::get_if<flutter::CustomEncodableValue>(&value)) ');
+    indent.scoped('{', '}', () {
+      for (final EnumeratedClass customClass in getCodecClasses(api, root)) {
+        indent
+            .write('if (custom_value->type() == typeid(${customClass.name})) ');
+        indent.scoped('{', '}', () {
+          indent.writeln('stream->WriteByte(${customClass.enumeration});');
+          indent.writeln(
+              'WriteValue(std::any_cast<${customClass.name}>(*custom_value).ToEncodableMap(), stream);');
+          indent.writeln('return;');
+        });
+      }
     });
-  }
+    indent.writeln('$_defaultCodecSerializer::WriteValue(value, stream);');
+  });
 }
 
 void _writeErrorOr(Indent indent,
@@ -245,7 +245,7 @@
         // TODO(gaaclarke): Find a way to be more precise with our
         // friendships.
         indent.writeln('friend class ${api.name};');
-        indent.writeln('friend class ${_getCodecName(api)};');
+        indent.writeln('friend class ${_getCodecSerializerName(api)};');
       }
       if (testFriend != null) {
         indent.writeln('friend class $testFriend;');
@@ -484,11 +484,13 @@
 void _writeHostApiSource(Indent indent, Api api, Root root) {
   assert(api.location == ApiLocation.host);
 
-  final String codecName = _getCodecName(api);
+  final String codeSerializerName = getCodecClasses(api, root).isNotEmpty
+      ? _getCodecSerializerName(api)
+      : _defaultCodecSerializer;
   indent.format('''
 /// The codec used by ${api.name}.
 const flutter::StandardMessageCodec& ${api.name}::GetCodec() {
-\treturn flutter::StandardMessageCodec::GetInstance(&$codecName::GetInstance());
+\treturn flutter::StandardMessageCodec::GetInstance(&$codeSerializerName::GetInstance());
 }
 ''');
   indent.writeln(
@@ -740,7 +742,7 @@
   }, nestCount: 0);
 }
 
-void _writeFlutterApiSource(Indent indent, Api api) {
+void _writeFlutterApiSource(Indent indent, Api api, Root root) {
   assert(api.location == ApiLocation.flutter);
   indent.writeln(
       '$_commentPrefix Generated class from Pigeon that represents Flutter messages that can be called from C++.');
@@ -750,10 +752,12 @@
     indent.writeln('this->binary_messenger_ = binary_messenger;');
   });
   indent.writeln('');
-  final String codecName = _getCodecName(api);
+  final String codeSerializerName = getCodecClasses(api, root).isNotEmpty
+      ? _getCodecSerializerName(api)
+      : _defaultCodecSerializer;
   indent.format('''
 const flutter::StandardMessageCodec& ${api.name}::GetCodec() {
-\treturn flutter::StandardMessageCodec::GetInstance(&$codecName::GetInstance());
+\treturn flutter::StandardMessageCodec::GetInstance(&$codeSerializerName::GetInstance());
 }
 ''');
   for (final Method func in api.methods) {
@@ -1081,7 +1085,9 @@
   }
 
   for (final Api api in root.apis) {
-    _writeCodecHeader(indent, api, root);
+    if (getCodecClasses(api, root).isNotEmpty) {
+      _writeCodecHeader(indent, api, root);
+    }
     indent.addln('');
     if (api.location == ApiLocation.host) {
       _writeHostApiHeader(indent, api, root);
@@ -1135,8 +1141,10 @@
   }
 
   for (final Api api in root.apis) {
-    _writeCodecSource(indent, api, root);
-    indent.addln('');
+    if (getCodecClasses(api, root).isNotEmpty) {
+      _writeCodecSource(indent, api, root);
+      indent.addln('');
+    }
     if (api.location == ApiLocation.host) {
       _writeHostApiSource(indent, api, root);
 
@@ -1158,7 +1166,7 @@
 }''');
       indent.addln('');
     } else if (api.location == ApiLocation.flutter) {
-      _writeFlutterApiSource(indent, api);
+      _writeFlutterApiSource(indent, api, root);
     }
   }
 
diff --git a/packages/pigeon/lib/dart_generator.dart b/packages/pigeon/lib/dart_generator.dart
index 4b2ff9d..70da7ca 100644
--- a/packages/pigeon/lib/dart_generator.dart
+++ b/packages/pigeon/lib/dart_generator.dart
@@ -18,6 +18,9 @@
 const DocumentCommentSpecification _docCommentSpec =
     DocumentCommentSpecification(_docCommentPrefix);
 
+/// The standard codec for Flutter, used for any non custom codecs and extended for custom codecs.
+const String _standardMessageCodec = 'StandardMessageCodec';
+
 /// Options that control how Dart code will be generated.
 class DartOptions {
   /// Constructor for DartOptions.
@@ -67,44 +70,43 @@
 ///
 /// class FooCodec extends StandardMessageCodec {...}
 void _writeCodec(Indent indent, String codecName, Api api, Root root) {
-  indent.write('class $codecName extends StandardMessageCodec ');
+  assert(getCodecClasses(api, root).isNotEmpty);
+  final Iterable<EnumeratedClass> codecClasses = getCodecClasses(api, root);
+  indent.write('class $codecName extends $_standardMessageCodec');
   indent.scoped('{', '}', () {
     indent.writeln('const $codecName();');
-    if (getCodecClasses(api, root).isNotEmpty) {
-      indent.writeln('@override');
-      indent.write('void writeValue(WriteBuffer buffer, Object? value) ');
+    indent.writeln('@override');
+    indent.write('void writeValue(WriteBuffer buffer, Object? value) ');
+    indent.scoped('{', '}', () {
+      for (final EnumeratedClass customClass in codecClasses) {
+        indent.write('if (value is ${customClass.name}) ');
+        indent.scoped('{', '} else ', () {
+          indent.writeln('buffer.putUint8(${customClass.enumeration});');
+          indent.writeln('writeValue(buffer, value.encode());');
+        });
+      }
       indent.scoped('{', '}', () {
-        for (final EnumeratedClass customClass in getCodecClasses(api, root)) {
-          indent.write('if (value is ${customClass.name}) ');
-          indent.scoped('{', '} else ', () {
-            indent.writeln('buffer.putUint8(${customClass.enumeration});');
-            indent.writeln('writeValue(buffer, value.encode());');
+        indent.writeln('super.writeValue(buffer, value);');
+      });
+    });
+    indent.writeln('@override');
+    indent.write('Object? readValueOfType(int type, ReadBuffer buffer) ');
+    indent.scoped('{', '}', () {
+      indent.write('switch (type) ');
+      indent.scoped('{', '}', () {
+        for (final EnumeratedClass customClass in codecClasses) {
+          indent.write('case ${customClass.enumeration}: ');
+          indent.writeScoped('', '', () {
+            indent.writeln(
+                'return ${customClass.name}.decode(readValue(buffer)!);');
           });
         }
-        indent.scoped('{', '}', () {
-          indent.writeln('super.writeValue(buffer, value);');
+        indent.write('default:');
+        indent.writeScoped('', '', () {
+          indent.writeln('return super.readValueOfType(type, buffer);');
         });
       });
-      indent.writeln('@override');
-      indent.write('Object? readValueOfType(int type, ReadBuffer buffer) ');
-      indent.scoped('{', '}', () {
-        indent.write('switch (type) ');
-        indent.scoped('{', '}', () {
-          for (final EnumeratedClass customClass
-              in getCodecClasses(api, root)) {
-            indent.write('case ${customClass.enumeration}: ');
-            indent.writeScoped('', '', () {
-              indent.writeln(
-                  'return ${customClass.name}.decode(readValue(buffer)!);');
-            });
-          }
-          indent.write('default:');
-          indent.writeScoped('', '', () {
-            indent.writeln('return super.readValueOfType(type, buffer);');
-          });
-        });
-      });
-    }
+    });
   });
 }
 
@@ -157,8 +159,11 @@
 /// }
 void _writeHostApi(DartOptions opt, Indent indent, Api api, Root root) {
   assert(api.location == ApiLocation.host);
-  final String codecName = _getCodecName(api);
-  _writeCodec(indent, codecName, api, root);
+  String codecName = _standardMessageCodec;
+  if (getCodecClasses(api, root).isNotEmpty) {
+    codecName = _getCodecName(api);
+    _writeCodec(indent, codecName, api, root);
+  }
   indent.addln('');
   bool first = true;
   addDocumentationComments(indent, api.documentationComments, _docCommentSpec);
@@ -169,7 +174,6 @@
 /// available for dependency injection.  If it is left null, the default
 /// BinaryMessenger will be used which routes to the host platform.
 ${api.name}({BinaryMessenger? binaryMessenger}) : _binaryMessenger = binaryMessenger;
-
 final BinaryMessenger? _binaryMessenger;
 ''');
 
@@ -272,8 +276,11 @@
   bool isMockHandler = false,
 }) {
   assert(api.location == ApiLocation.flutter);
-  final String codecName = _getCodecName(api);
-  _writeCodec(indent, codecName, api, root);
+  String codecName = _standardMessageCodec;
+  if (getCodecClasses(api, root).isNotEmpty) {
+    codecName = _getCodecName(api);
+    _writeCodec(indent, codecName, api, root);
+  }
   addDocumentationComments(indent, api.documentationComments, _docCommentSpec);
 
   indent.write('abstract class ${api.name} ');
diff --git a/packages/pigeon/lib/generator_tools.dart b/packages/pigeon/lib/generator_tools.dart
index 2d8afea..e23dc62 100644
--- a/packages/pigeon/lib/generator_tools.dart
+++ b/packages/pigeon/lib/generator_tools.dart
@@ -9,7 +9,7 @@
 import 'ast.dart';
 
 /// The current version of pigeon. This must match the version in pubspec.yaml.
-const String pigeonVersion = '4.2.1';
+const String pigeonVersion = '4.2.2';
 
 /// Read all the content from [stdin] to a String.
 String readStdin() {
diff --git a/packages/pigeon/lib/java_generator.dart b/packages/pigeon/lib/java_generator.dart
index d0f65bd..0734569 100644
--- a/packages/pigeon/lib/java_generator.dart
+++ b/packages/pigeon/lib/java_generator.dart
@@ -24,6 +24,9 @@
   blockContinuationToken: _docCommentContinuation,
 );
 
+/// The standard codec for Flutter, used for any non custom codecs and extended for custom codecs.
+const String _standardMessageCodec = 'StandardMessageCodec';
+
 /// Options that control how Java code will be generated.
 class JavaOptions {
   /// Creates a [JavaOptions] object
@@ -93,50 +96,50 @@
 /// Example:
 /// private static class FooCodec extends StandardMessageCodec {...}
 void _writeCodec(Indent indent, Api api, Root root) {
+  assert(getCodecClasses(api, root).isNotEmpty);
+  final Iterable<EnumeratedClass> codecClasses = getCodecClasses(api, root);
   final String codecName = _getCodecName(api);
-  indent.write('private static class $codecName extends StandardMessageCodec ');
+  indent
+      .write('private static class $codecName extends $_standardMessageCodec ');
   indent.scoped('{', '}', () {
     indent
         .writeln('public static final $codecName INSTANCE = new $codecName();');
     indent.writeln('private $codecName() {}');
-    if (getCodecClasses(api, root).isNotEmpty) {
-      indent.writeln('@Override');
-      indent.write(
-          'protected Object readValueOfType(byte type, @NonNull ByteBuffer buffer) ');
+    indent.writeln('@Override');
+    indent.write(
+        'protected Object readValueOfType(byte type, @NonNull ByteBuffer buffer) ');
+    indent.scoped('{', '}', () {
+      indent.write('switch (type) ');
       indent.scoped('{', '}', () {
-        indent.write('switch (type) ');
-        indent.scoped('{', '}', () {
-          for (final EnumeratedClass customClass
-              in getCodecClasses(api, root)) {
-            indent.write('case (byte)${customClass.enumeration}: ');
-            indent.writeScoped('', '', () {
-              indent.writeln(
-                  'return ${customClass.name}.fromMap((Map<String, Object>) readValue(buffer));');
-            });
-          }
-          indent.write('default:');
+        for (final EnumeratedClass customClass in codecClasses) {
+          indent.write('case (byte)${customClass.enumeration}: ');
           indent.writeScoped('', '', () {
-            indent.writeln('return super.readValueOfType(type, buffer);');
-          });
-        });
-      });
-      indent.writeln('@Override');
-      indent.write(
-          'protected void writeValue(@NonNull ByteArrayOutputStream stream, Object value) ');
-      indent.writeScoped('{', '}', () {
-        for (final EnumeratedClass customClass in getCodecClasses(api, root)) {
-          indent.write('if (value instanceof ${customClass.name}) ');
-          indent.scoped('{', '} else ', () {
-            indent.writeln('stream.write(${customClass.enumeration});');
             indent.writeln(
-                'writeValue(stream, ((${customClass.name}) value).toMap());');
+                'return ${customClass.name}.fromMap((Map<String, Object>) readValue(buffer));');
           });
         }
-        indent.scoped('{', '}', () {
-          indent.writeln('super.writeValue(stream, value);');
+        indent.write('default:');
+        indent.writeScoped('', '', () {
+          indent.writeln('return super.readValueOfType(type, buffer);');
         });
       });
-    }
+    });
+    indent.writeln('@Override');
+    indent.write(
+        'protected void writeValue(@NonNull ByteArrayOutputStream stream, Object value) ');
+    indent.writeScoped('{', '}', () {
+      for (final EnumeratedClass customClass in codecClasses) {
+        indent.write('if (value instanceof ${customClass.name}) ');
+        indent.scoped('{', '} else ', () {
+          indent.writeln('stream.write(${customClass.enumeration});');
+          indent.writeln(
+              'writeValue(stream, ((${customClass.name}) value).toMap());');
+        });
+      }
+      indent.scoped('{', '}', () {
+        indent.writeln('super.writeValue(stream, value);');
+      });
+    });
   });
 }
 
@@ -309,12 +312,17 @@
     api.methods.forEach(writeInterfaceMethod);
     indent.addln('');
     final String codecName = _getCodecName(api);
-    indent.format('''
-/** The codec used by ${api.name}. */
-static MessageCodec<Object> getCodec() {
-\treturn $codecName.INSTANCE;
-}
-''');
+    indent.writeln('/** The codec used by ${api.name}. */');
+    indent.write('static MessageCodec<Object> getCodec() ');
+    indent.scoped('{', '}', () {
+      indent.write('return ');
+      if (getCodecClasses(api, root).isNotEmpty) {
+        indent.write('$codecName.INSTANCE;');
+      } else {
+        indent.write('new $_standardMessageCodec();');
+      }
+    });
+
     indent.writeln(
         '${_docCommentPrefix}Sets up an instance of `${api.name}` to handle messages through the `binaryMessenger`.$_docCommentSuffix');
     indent.write(
@@ -341,7 +349,7 @@
 ///   }
 ///   public int add(int x, int y, Reply<int> callback) {...}
 /// }
-void _writeFlutterApi(Indent indent, Api api) {
+void _writeFlutterApi(Indent indent, Api api, Root root) {
   assert(api.location == ApiLocation.flutter);
   const List<String> generatedMessages = <String>[
     ' Generated class from Pigeon that represents Flutter messages that can be called from Java.'
@@ -361,11 +369,17 @@
       indent.writeln('void reply(T reply);');
     });
     final String codecName = _getCodecName(api);
-    indent.format('''
-static MessageCodec<Object> getCodec() {
-\treturn $codecName.INSTANCE;
-}
-''');
+    indent.writeln('/** The codec used by ${api.name}. */');
+    indent.write('static MessageCodec<Object> getCodec() ');
+    indent.scoped('{', '}', () {
+      indent.write('return ');
+      if (getCodecClasses(api, root).isNotEmpty) {
+        indent.writeln('$codecName.INSTANCE;');
+      } else {
+        indent.writeln('new $_standardMessageCodec();');
+      }
+    });
+
     for (final Method func in api.methods) {
       final String channelName = makeChannelName(api, func);
       final String returnType = func.returnType.isVoid
@@ -715,7 +729,7 @@
     if (api.location == ApiLocation.host) {
       _writeHostApi(indent, api, root);
     } else if (api.location == ApiLocation.flutter) {
-      _writeFlutterApi(indent, api);
+      _writeFlutterApi(indent, api, root);
     }
   }
 
@@ -765,8 +779,10 @@
     }
 
     for (final Api api in root.apis) {
-      _writeCodec(indent, api, root);
-      indent.addln('');
+      if (getCodecClasses(api, root).isNotEmpty) {
+        _writeCodec(indent, api, root);
+        indent.addln('');
+      }
       writeApi(api);
     }
 
diff --git a/packages/pigeon/lib/kotlin_generator.dart b/packages/pigeon/lib/kotlin_generator.dart
index a940d40..d049f86 100644
--- a/packages/pigeon/lib/kotlin_generator.dart
+++ b/packages/pigeon/lib/kotlin_generator.dart
@@ -71,48 +71,46 @@
 /// Example:
 /// private static class FooCodec extends StandardMessageCodec {...}
 void _writeCodec(Indent indent, Api api, Root root) {
+  assert(getCodecClasses(api, root).isNotEmpty);
+  final Iterable<EnumeratedClass> codecClasses = getCodecClasses(api, root);
   final String codecName = _getCodecName(api);
   indent.writeln('@Suppress("UNCHECKED_CAST")');
   indent.write('private object $codecName : StandardMessageCodec() ');
   indent.scoped('{', '}', () {
-    if (getCodecClasses(api, root).isNotEmpty) {
-      indent.write(
-          'override fun readValueOfType(type: Byte, buffer: ByteBuffer): Any? ');
+    indent.write(
+        'override fun readValueOfType(type: Byte, buffer: ByteBuffer): Any? ');
+    indent.scoped('{', '}', () {
+      indent.write('return when (type) ');
       indent.scoped('{', '}', () {
-        indent.write('return when (type) ');
-        indent.scoped('{', '}', () {
-          for (final EnumeratedClass customClass
-              in getCodecClasses(api, root)) {
-            indent.write('${customClass.enumeration}.toByte() -> ');
+        for (final EnumeratedClass customClass in codecClasses) {
+          indent.write('${customClass.enumeration}.toByte() -> ');
+          indent.scoped('{', '}', () {
+            indent.write(
+                'return (readValue(buffer) as? Map<String, Any?>)?.let ');
             indent.scoped('{', '}', () {
-              indent.write(
-                  'return (readValue(buffer) as? Map<String, Any?>)?.let ');
-              indent.scoped('{', '}', () {
-                indent.writeln('${customClass.name}.fromMap(it)');
-              });
+              indent.writeln('${customClass.name}.fromMap(it)');
             });
-          }
-          indent.writeln('else -> super.readValueOfType(type, buffer)');
-        });
+          });
+        }
+        indent.writeln('else -> super.readValueOfType(type, buffer)');
       });
+    });
 
-      indent.write(
-          'override fun writeValue(stream: ByteArrayOutputStream, value: Any?) ');
-      indent.writeScoped('{', '}', () {
-        indent.write('when (value) ');
-        indent.scoped('{', '}', () {
-          for (final EnumeratedClass customClass
-              in getCodecClasses(api, root)) {
-            indent.write('is ${customClass.name} -> ');
-            indent.scoped('{', '}', () {
-              indent.writeln('stream.write(${customClass.enumeration})');
-              indent.writeln('writeValue(stream, value.toMap())');
-            });
-          }
-          indent.writeln('else -> super.writeValue(stream, value)');
-        });
+    indent.write(
+        'override fun writeValue(stream: ByteArrayOutputStream, value: Any?) ');
+    indent.writeScoped('{', '}', () {
+      indent.write('when (value) ');
+      indent.scoped('{', '}', () {
+        for (final EnumeratedClass customClass in codecClasses) {
+          indent.write('is ${customClass.name} -> ');
+          indent.scoped('{', '}', () {
+            indent.writeln('stream.write(${customClass.enumeration})');
+            indent.writeln('writeValue(stream, value.toMap())');
+          });
+        }
+        indent.writeln('else -> super.writeValue(stream, value)');
       });
-    }
+    });
   });
 }
 
@@ -129,6 +127,8 @@
 
   final String apiName = api.name;
 
+  final bool isCustomCodec = getCodecClasses(api, root).isNotEmpty;
+
   const List<String> generatedMessages = <String>[
     ' Generated interface from Pigeon that represents a handler of messages from Flutter.'
   ];
@@ -172,8 +172,13 @@
     indent.write('companion object ');
     indent.scoped('{', '}', () {
       indent.writeln('/** The codec used by $apiName. */');
-      indent.scoped('val codec: MessageCodec<Any?> by lazy {', '}', () {
-        indent.writeln(_getCodecName(api));
+      indent.write('val codec: MessageCodec<Any?> by lazy ');
+      indent.scoped('{', '}', () {
+        if (isCustomCodec) {
+          indent.writeln(_getCodecName(api));
+        } else {
+          indent.writeln('StandardMessageCodec()');
+        }
       });
       indent.writeln(
           '/** Sets up an instance of `$apiName` to handle messages through the `binaryMessenger`. */');
@@ -182,8 +187,8 @@
           'fun setUp(binaryMessenger: BinaryMessenger, api: $apiName?) ');
       indent.scoped('{', '}', () {
         for (final Method method in api.methods) {
-          indent.write('');
-          indent.scoped('run {', '}', () {
+          indent.write('run ');
+          indent.scoped('{', '}', () {
             String? taskQueue;
             if (method.taskQueueType != TaskQueueType.serial) {
               taskQueue = 'taskQueue';
@@ -245,7 +250,7 @@
                   }
                 }, addTrailingNewline: false);
                 indent.add(' catch (exception: Error) ');
-                indent.scoped('{', '}', () {
+                indent.scoped('{', '', () {
                   indent.writeln(
                       'wrapped["${Keys.error}"] = wrapError(exception)');
                   if (method.isAsynchronous) {
@@ -257,7 +262,7 @@
                 }
               });
             }, addTrailingNewline: false);
-            indent.scoped(' else {', '}', () {
+            indent.scoped('} else {', '}', () {
               indent.writeln('channel.setMessageHandler(null)');
             });
           });
@@ -279,8 +284,10 @@
 /// class Foo(private val binaryMessenger: BinaryMessenger) {
 ///   fun add(x: Int, y: Int, callback: (Int?) -> Unit) {...}
 /// }
-void _writeFlutterApi(Indent indent, Api api) {
+void _writeFlutterApi(Indent indent, Api api, Root root) {
   assert(api.location == ApiLocation.flutter);
+  final bool isCustomCodec = getCodecClasses(api, root).isNotEmpty;
+
   const List<String> generatedMessages = <String>[
     ' Generated class from Pigeon that represents Flutter messages that can be called from Kotlin.'
   ];
@@ -296,7 +303,11 @@
       indent.writeln('/** The codec used by $apiName. */');
       indent.write('val codec: MessageCodec<Any?> by lazy ');
       indent.scoped('{', '}', () {
-        indent.writeln(_getCodecName(api));
+        if (isCustomCodec) {
+          indent.writeln(_getCodecName(api));
+        } else {
+          indent.writeln('StandardMessageCodec()');
+        }
       });
     });
 
@@ -610,12 +621,14 @@
         indent, klass.documentationComments, _docCommentSpec,
         generatorComments: generatedMessages);
 
-    indent.write('data class ${klass.name}(');
-    indent.scoped('', '', () {
+    indent.write('data class ${klass.name} ');
+    indent.scoped('(', '', () {
       for (final NamedType element in klass.fields) {
         writeField(element);
         if (klass.fields.last != element) {
           indent.addln(',');
+        } else {
+          indent.addln('');
         }
       }
     });
@@ -630,7 +643,7 @@
     if (api.location == ApiLocation.host) {
       _writeHostApi(indent, api, root);
     } else if (api.location == ApiLocation.flutter) {
-      _writeFlutterApi(indent, api);
+      _writeFlutterApi(indent, api, root);
     }
   }
 
@@ -685,8 +698,10 @@
   }
 
   for (final Api api in root.apis) {
-    _writeCodec(indent, api, root);
-    indent.addln('');
+    if (getCodecClasses(api, root).isNotEmpty) {
+      _writeCodec(indent, api, root);
+      indent.addln('');
+    }
     writeApi(api);
   }
 
diff --git a/packages/pigeon/lib/objc_generator.dart b/packages/pigeon/lib/objc_generator.dart
index af8edd4..bc6077a 100644
--- a/packages/pigeon/lib/objc_generator.dart
+++ b/packages/pigeon/lib/objc_generator.dart
@@ -265,52 +265,50 @@
 /// NSObject<FlutterMessageCodec> *FooHostApiCodecGetCodec() {...}
 void _writeCodec(
     Indent indent, String name, ObjcOptions options, Api api, Root root) {
+  assert(getCodecClasses(api, root).isNotEmpty);
+  final Iterable<EnumeratedClass> codecClasses = getCodecClasses(api, root);
   final String readerWriterName = '${name}ReaderWriter';
   final String readerName = '${name}Reader';
   final String writerName = '${name}Writer';
   indent.writeln('@interface $readerName : FlutterStandardReader');
   indent.writeln('@end');
   indent.writeln('@implementation $readerName');
-  if (getCodecClasses(api, root).isNotEmpty) {
-    indent.writeln('- (nullable id)readValueOfType:(UInt8)type ');
+  indent.writeln('- (nullable id)readValueOfType:(UInt8)type ');
+  indent.scoped('{', '}', () {
+    indent.write('switch (type) ');
     indent.scoped('{', '}', () {
-      indent.write('switch (type) ');
-      indent.scoped('{', '}', () {
-        for (final EnumeratedClass customClass in getCodecClasses(api, root)) {
-          indent.write('case ${customClass.enumeration}: ');
-          indent.writeScoped('', '', () {
-            indent.writeln(
-                'return [${_className(options.prefix, customClass.name)} fromMap:[self readValue]];');
-          });
-        }
-        indent.write('default:');
+      for (final EnumeratedClass customClass in codecClasses) {
+        indent.write('case ${customClass.enumeration}: ');
         indent.writeScoped('', '', () {
-          indent.writeln('return [super readValueOfType:type];');
+          indent.writeln(
+              'return [${_className(options.prefix, customClass.name)} fromMap:[self readValue]];');
         });
+      }
+      indent.write('default:');
+      indent.writeScoped('', '', () {
+        indent.writeln('return [super readValueOfType:type];');
       });
     });
-  }
+  });
   indent.writeln('@end');
   indent.addln('');
   indent.writeln('@interface $writerName : FlutterStandardWriter');
   indent.writeln('@end');
   indent.writeln('@implementation $writerName');
-  if (getCodecClasses(api, root).isNotEmpty) {
-    indent.writeln('- (void)writeValue:(id)value ');
-    indent.scoped('{', '}', () {
-      for (final EnumeratedClass customClass in getCodecClasses(api, root)) {
-        indent.write(
-            'if ([value isKindOfClass:[${_className(options.prefix, customClass.name)} class]]) ');
-        indent.scoped('{', '} else ', () {
-          indent.writeln('[self writeByte:${customClass.enumeration}];');
-          indent.writeln('[self writeValue:[value toMap]];');
-        });
-      }
-      indent.scoped('{', '}', () {
-        indent.writeln('[super writeValue:value];');
+  indent.writeln('- (void)writeValue:(id)value ');
+  indent.scoped('{', '}', () {
+    for (final EnumeratedClass customClass in codecClasses) {
+      indent.write(
+          'if ([value isKindOfClass:[${_className(options.prefix, customClass.name)} class]]) ');
+      indent.scoped('{', '} else ', () {
+        indent.writeln('[self writeByte:${customClass.enumeration}];');
+        indent.writeln('[self writeValue:[value toMap]];');
       });
+    }
+    indent.scoped('{', '}', () {
+      indent.writeln('[super writeValue:value];');
     });
-  }
+  });
   indent.writeln('@end');
   indent.addln('');
   indent.format('''
@@ -324,19 +322,35 @@
 \treturn [[$readerName alloc] initWithData:data];
 }
 @end
-
-NSObject<FlutterMessageCodec> *${_getCodecGetterName(options.prefix, api.name)}() {
-\tstatic dispatch_once_t sPred = 0;
-\tstatic FlutterStandardMessageCodec *sSharedObject = nil;
-\tdispatch_once(&sPred, ^{
-\t\t$readerWriterName *readerWriter = [[$readerWriterName alloc] init];
-\t\tsSharedObject = [FlutterStandardMessageCodec codecWithReaderWriter:readerWriter];
-\t});
-\treturn sSharedObject;
-}
 ''');
 }
 
+void _writeCodecGetter(
+    Indent indent, String name, ObjcOptions options, Api api, Root root) {
+  final String readerWriterName = '${name}ReaderWriter';
+
+  indent.write(
+      'NSObject<FlutterMessageCodec> *${_getCodecGetterName(options.prefix, api.name)}() ');
+  indent.scoped('{', '}', () {
+    indent.writeln('static FlutterStandardMessageCodec *sSharedObject = nil;');
+    if (getCodecClasses(api, root).isNotEmpty) {
+      indent.writeln('static dispatch_once_t sPred = 0;');
+      indent.write('dispatch_once(&sPred, ^');
+      indent.scoped('{', '});', () {
+        indent.writeln(
+            '$readerWriterName *readerWriter = [[$readerWriterName alloc] init];');
+        indent.writeln(
+            'sSharedObject = [FlutterStandardMessageCodec codecWithReaderWriter:readerWriter];');
+      });
+    } else {
+      indent.writeln(
+          'sSharedObject = [FlutterStandardMessageCodec sharedInstance];');
+    }
+
+    indent.writeln('return sSharedObject;');
+  });
+}
+
 String _capitalize(String str) =>
     (str.isEmpty) ? '' : str[0].toUpperCase() + str.substring(1);
 
@@ -454,14 +468,15 @@
       lastArgType = 'FlutterError *_Nullable *_Nonnull';
       lastArgName = 'error';
     }
+    final List<String> generatorComments = <String>[];
     if (!func.returnType.isNullable &&
         !func.returnType.isVoid &&
         !func.isAsynchronous) {
-      indent.writeln(
-          '$_docCommentPrefix @return `nil` only when `error != nil`.');
+      generatorComments.add(' @return `nil` only when `error != nil`.');
     }
     addDocumentationComments(
-        indent, func.documentationComments, _docCommentSpec);
+        indent, func.documentationComments, _docCommentSpec,
+        generatorComments: generatorComments);
 
     final String signature = _makeObjcSignature(
       func: func,
@@ -579,7 +594,7 @@
 
   for (final Api api in root.apis) {
     indent.writeln(
-        '${_docCommentPrefix}The codec used by ${_className(options.prefix, api.name)}.');
+        '$_docCommentPrefix The codec used by ${_className(options.prefix, api.name)}.');
     indent.writeln(
         'NSObject<FlutterMessageCodec> *${_getCodecGetterName(options.prefix, api.name)}(void);');
     indent.addln('');
@@ -638,12 +653,14 @@
     indent.inc();
     indent.writeln('initWithName:@"${makeChannelName(api, func)}"');
     indent.writeln('binaryMessenger:binaryMessenger');
-    indent.write('codec:${_getCodecGetterName(options.prefix, api.name)}()');
+    indent.write('codec:');
+    indent.add('${_getCodecGetterName(options.prefix, api.name)}()');
+
     if (taskQueue != null) {
       indent.addln('');
-      indent.writeln('taskQueue:$taskQueue];');
+      indent.addln('taskQueue:$taskQueue];');
     } else {
-      indent.writeln('];');
+      indent.addln('];');
     }
     indent.dec();
     indent.dec();
@@ -831,8 +848,8 @@
       indent.inc();
       indent.writeln('messageChannelWithName:@"${makeChannelName(api, func)}"');
       indent.writeln('binaryMessenger:self.binaryMessenger');
-      indent.writeln(
-          'codec:${_getCodecGetterName(options.prefix, api.name)}()];');
+      indent.write('codec:${_getCodecGetterName(options.prefix, api.name)}()');
+      indent.write('];');
       indent.dec();
       indent.dec();
       indent.write('[channel sendMessage:$sendArgument reply:^(id reply) ');
@@ -982,7 +999,11 @@
 
   void writeApi(Api api) {
     final String codecName = _getCodecName(options.prefix, api.name);
-    _writeCodec(indent, codecName, options, api, root);
+    if (getCodecClasses(api, root).isNotEmpty) {
+      _writeCodec(indent, codecName, options, api, root);
+      indent.addln('');
+    }
+    _writeCodecGetter(indent, codecName, options, api, root);
     indent.addln('');
     if (api.location == ApiLocation.host) {
       _writeHostApiSource(indent, options, api, root);
diff --git a/packages/pigeon/lib/swift_generator.dart b/packages/pigeon/lib/swift_generator.dart
index 7719b05..758199d 100644
--- a/packages/pigeon/lib/swift_generator.dart
+++ b/packages/pigeon/lib/swift_generator.dart
@@ -56,6 +56,7 @@
 /// private class FooHostApiCodecWriter: FlutterStandardWriter {...}
 /// private class FooHostApiCodecReaderWriter: FlutterStandardReaderWriter {...}
 void _writeCodec(Indent indent, Api api, Root root) {
+  assert(getCodecClasses(api, root).isNotEmpty);
   final String codecName = _getCodecName(api);
   final String readerWriterName = '${codecName}ReaderWriter';
   final String readerName = '${codecName}Reader';
@@ -189,8 +190,12 @@
   indent.scoped('{', '}', () {
     final String codecName = _getCodecName(api);
     indent.writeln('$_docCommentPrefix The codec used by $apiName.');
-    indent.writeln(
-        'static var codec: FlutterStandardMessageCodec { $codecName.shared }');
+    String codecArgumentString = '';
+    if (getCodecClasses(api, root).isNotEmpty) {
+      codecArgumentString = ', codec: codec';
+      indent.writeln(
+          'static var codec: FlutterStandardMessageCodec { $codecName.shared }');
+    }
     indent.writeln(
         '$_docCommentPrefix Sets up an instance of `$apiName` to handle messages through the `binaryMessenger`.');
     indent.write(
@@ -203,7 +208,7 @@
             indent, method.documentationComments, _docCommentSpec);
 
         indent.writeln(
-            'let $varChannelName = FlutterBasicMessageChannel(name: "$channelName", binaryMessenger: binaryMessenger, codec: codec)');
+            'let $varChannelName = FlutterBasicMessageChannel(name: "$channelName", binaryMessenger: binaryMessenger$codecArgumentString)');
         indent.write('if let api = api ');
         indent.scoped('{', '}', () {
           indent.write('$varChannelName.setMessageHandler ');
@@ -290,10 +295,14 @@
       indent.writeln('self.binaryMessenger = binaryMessenger');
     });
     final String codecName = _getCodecName(api);
-    indent.write('var codec: FlutterStandardMessageCodec ');
-    indent.scoped('{', '}', () {
-      indent.writeln('return $codecName.shared');
-    });
+    String codecArgumentString = '';
+    if (getCodecClasses(api, root).isNotEmpty) {
+      codecArgumentString = ', codec: codec';
+      indent.write('var codec: FlutterStandardMessageCodec ');
+      indent.scoped('{', '}', () {
+        indent.writeln('return $codecName.shared');
+      });
+    }
     for (final Method func in api.methods) {
       final String channelName = makeChannelName(api, func);
       final String returnType = func.returnType.isVoid
@@ -332,7 +341,7 @@
       indent.scoped('{', '}', () {
         const String channel = 'channel';
         indent.writeln(
-            'let $channel = FlutterBasicMessageChannel(name: "$channelName", binaryMessenger: binaryMessenger, codec: codec)');
+            'let $channel = FlutterBasicMessageChannel(name: "$channelName", binaryMessenger: binaryMessenger$codecArgumentString)');
         indent.write('$channel.sendMessage($sendArgument) ');
         if (func.returnType.isVoid) {
           indent.scoped('{ _ in', '}', () {
@@ -641,8 +650,10 @@
   }
 
   for (final Api api in root.apis) {
-    _writeCodec(indent, api, root);
-    indent.addln('');
+    if (getCodecClasses(api, root).isNotEmpty) {
+      _writeCodec(indent, api, root);
+      indent.addln('');
+    }
     writeApi(api, root);
   }
 
diff --git a/packages/pigeon/platform_tests/ios_swift_unit_tests/ios/RunnerTests/MultipleArityTests.swift b/packages/pigeon/platform_tests/ios_swift_unit_tests/ios/RunnerTests/MultipleArityTests.swift
index f70f0e9..23f3e34 100644
--- a/packages/pigeon/platform_tests/ios_swift_unit_tests/ios/RunnerTests/MultipleArityTests.swift
+++ b/packages/pigeon/platform_tests/ios_swift_unit_tests/ios/RunnerTests/MultipleArityTests.swift
@@ -1,7 +1,6 @@
 // Copyright 2013 The Flutter Authors. All rights reserved.
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
-
 import XCTest
 @testable import Runner
 
@@ -12,7 +11,7 @@
 }
 
 class MultipleArityTests: XCTestCase {
-  
+  var codec = FlutterStandardMessageCodec.sharedInstance()
   func testSimpleHost() throws {
     let binaryMessenger = MockBinaryMessenger<Int32>(codec: EnumApi2HostCodec.shared)
     MultipleArityHostApiSetup.setUp(binaryMessenger: binaryMessenger, api: MockMultipleArityHostApi())
@@ -37,7 +36,7 @@
   }
   
   func testSimpleFlutter() throws {
-    let binaryMessenger = HandlerBinaryMessenger(codec: MultipleArityHostApiCodec.shared) { args in
+    let binaryMessenger = HandlerBinaryMessenger(codec: codec) { args in
       return (args[0] as! Int) - (args[1] as! Int)
     }
     let api = MultipleArityFlutterApi(binaryMessenger: binaryMessenger)
diff --git a/packages/pigeon/platform_tests/ios_swift_unit_tests/ios/RunnerTests/NullableReturnsTests.swift b/packages/pigeon/platform_tests/ios_swift_unit_tests/ios/RunnerTests/NullableReturnsTests.swift
index 7d8acf5..b80c891 100644
--- a/packages/pigeon/platform_tests/ios_swift_unit_tests/ios/RunnerTests/NullableReturnsTests.swift
+++ b/packages/pigeon/platform_tests/ios_swift_unit_tests/ios/RunnerTests/NullableReturnsTests.swift
@@ -1,7 +1,6 @@
 // Copyright 2013 The Flutter Authors. All rights reserved.
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
-
 import XCTest
 @testable import Runner
 
@@ -17,8 +16,9 @@
 }
 
 class NullableReturnsTests: XCTestCase {
+  var codec = FlutterStandardMessageCodec.sharedInstance()
   func testNullableParameterWithFlutterApi() {
-    let binaryMessenger = EchoBinaryMessenger(codec: NullableArgFlutterApiCodec.shared)
+    let binaryMessenger = EchoBinaryMessenger(codec: codec)
     binaryMessenger.defaultReturn = 99
     let api = NullableArgFlutterApi(binaryMessenger: binaryMessenger)
     
@@ -32,7 +32,7 @@
   
   func testNullableParameterWithHostApi() {
     let api = MockNullableArgHostApi()
-    let binaryMessenger = MockBinaryMessenger<Int32?>(codec: NullableArgHostApiCodec.shared)
+    let binaryMessenger = MockBinaryMessenger<Int32?>(codec: codec)
     let channel = "dev.flutter.pigeon.NullableArgHostApi.doit"
     
     NullableArgHostApiSetup.setUp(binaryMessenger: binaryMessenger, api: api)
diff --git a/packages/pigeon/platform_tests/ios_swift_unit_tests/ios/RunnerTests/PrimitiveTests.swift b/packages/pigeon/platform_tests/ios_swift_unit_tests/ios/RunnerTests/PrimitiveTests.swift
index f9c6b5f..d825b00 100644
--- a/packages/pigeon/platform_tests/ios_swift_unit_tests/ios/RunnerTests/PrimitiveTests.swift
+++ b/packages/pigeon/platform_tests/ios_swift_unit_tests/ios/RunnerTests/PrimitiveTests.swift
@@ -1,7 +1,6 @@
 // Copyright 2013 The Flutter Authors. All rights reserved.
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
-
 import XCTest
 @testable import Runner
 
@@ -18,9 +17,10 @@
 }
 
 class PrimitiveTests: XCTestCase {
+  var codec = FlutterStandardMessageCodec.sharedInstance()
   
   func testIntPrimitiveHost() throws {
-    let binaryMessenger = MockBinaryMessenger<Int32>(codec: PrimitiveHostApiCodec.shared)
+    let binaryMessenger = MockBinaryMessenger<Int32>(codec: codec)
     PrimitiveHostApiSetup.setUp(binaryMessenger: binaryMessenger, api: MockPrimitiveHostApi())
     let channelName = "dev.flutter.pigeon.PrimitiveHostApi.anInt"
     XCTAssertNotNil(binaryMessenger.handlers[channelName])
@@ -42,7 +42,7 @@
   }
   
   func testIntPrimitiveFlutter() throws {
-    let binaryMessenger = EchoBinaryMessenger(codec: PrimitiveHostApiCodec.shared)
+    let binaryMessenger = EchoBinaryMessenger(codec: codec)
     let api = PrimitiveFlutterApi(binaryMessenger: binaryMessenger)
     
     let expectation = XCTestExpectation(description: "callback")
@@ -54,7 +54,7 @@
   }
   
   func testBoolPrimitiveHost() throws {
-    let binaryMessenger = MockBinaryMessenger<Bool>(codec: PrimitiveHostApiCodec.shared)
+    let binaryMessenger = MockBinaryMessenger<Bool>(codec: codec)
     PrimitiveHostApiSetup.setUp(binaryMessenger: binaryMessenger, api: MockPrimitiveHostApi())
     let channelName = "dev.flutter.pigeon.PrimitiveHostApi.aBool"
     XCTAssertNotNil(binaryMessenger.handlers[channelName])
@@ -76,7 +76,7 @@
   }
   
   func testBoolPrimitiveFlutter() throws {
-    let binaryMessenger = EchoBinaryMessenger(codec: PrimitiveHostApiCodec.shared)
+    let binaryMessenger = EchoBinaryMessenger(codec: codec)
     let api = PrimitiveFlutterApi(binaryMessenger: binaryMessenger)
     
     let expectation = XCTestExpectation(description: "callback")
@@ -88,7 +88,7 @@
   }
   
   func testDoublePrimitiveHost() throws {
-    let binaryMessenger = MockBinaryMessenger<Double>(codec: PrimitiveHostApiCodec.shared)
+    let binaryMessenger = MockBinaryMessenger<Double>(codec: codec)
     PrimitiveHostApiSetup.setUp(binaryMessenger: binaryMessenger, api: MockPrimitiveHostApi())
     let channelName = "dev.flutter.pigeon.PrimitiveHostApi.aDouble"
     XCTAssertNotNil(binaryMessenger.handlers[channelName])
@@ -110,7 +110,7 @@
   }
   
   func testDoublePrimitiveFlutter() throws {
-    let binaryMessenger = EchoBinaryMessenger(codec: PrimitiveHostApiCodec.shared)
+    let binaryMessenger = EchoBinaryMessenger(codec: codec)
     let api = PrimitiveFlutterApi(binaryMessenger: binaryMessenger)
     
     let expectation = XCTestExpectation(description: "callback")
@@ -123,7 +123,7 @@
   }
   
   func testStringPrimitiveHost() throws {
-    let binaryMessenger = MockBinaryMessenger<String>(codec: PrimitiveHostApiCodec.shared)
+    let binaryMessenger = MockBinaryMessenger<String>(codec: codec)
     PrimitiveHostApiSetup.setUp(binaryMessenger: binaryMessenger, api: MockPrimitiveHostApi())
     let channelName = "dev.flutter.pigeon.PrimitiveHostApi.aString"
     XCTAssertNotNil(binaryMessenger.handlers[channelName])
@@ -145,7 +145,7 @@
   }
   
   func testStringPrimitiveFlutter() throws {
-    let binaryMessenger = EchoBinaryMessenger(codec: PrimitiveHostApiCodec.shared)
+    let binaryMessenger = EchoBinaryMessenger(codec: codec)
     let api = PrimitiveFlutterApi(binaryMessenger: binaryMessenger)
     
     let expectation = XCTestExpectation(description: "callback")
@@ -158,7 +158,7 @@
   }
   
   func testListPrimitiveHost() throws {
-    let binaryMessenger = MockBinaryMessenger<[Int]>(codec: PrimitiveHostApiCodec.shared)
+    let binaryMessenger = MockBinaryMessenger<[Int]>(codec: codec)
     PrimitiveHostApiSetup.setUp(binaryMessenger: binaryMessenger, api: MockPrimitiveHostApi())
     let channelName = "dev.flutter.pigeon.PrimitiveHostApi.aList"
     XCTAssertNotNil(binaryMessenger.handlers[channelName])
@@ -180,7 +180,7 @@
   }
   
   func testListPrimitiveFlutter() throws {
-    let binaryMessenger = EchoBinaryMessenger(codec: PrimitiveHostApiCodec.shared)
+    let binaryMessenger = EchoBinaryMessenger(codec: codec)
     let api = PrimitiveFlutterApi(binaryMessenger: binaryMessenger)
     
     let expectation = XCTestExpectation(description: "callback")
@@ -193,7 +193,7 @@
   }
   
   func testMapPrimitiveHost() throws {
-    let binaryMessenger = MockBinaryMessenger<[String: Int]>(codec: PrimitiveHostApiCodec.shared)
+    let binaryMessenger = MockBinaryMessenger<[String: Int]>(codec: codec)
     PrimitiveHostApiSetup.setUp(binaryMessenger: binaryMessenger, api: MockPrimitiveHostApi())
     let channelName = "dev.flutter.pigeon.PrimitiveHostApi.aMap"
     XCTAssertNotNil(binaryMessenger.handlers[channelName])
@@ -215,7 +215,7 @@
   }
   
   func testMapPrimitiveFlutter() throws {
-    let binaryMessenger = EchoBinaryMessenger(codec: PrimitiveHostApiCodec.shared)
+    let binaryMessenger = EchoBinaryMessenger(codec: codec)
     let api = PrimitiveFlutterApi(binaryMessenger: binaryMessenger)
     
     let expectation = XCTestExpectation(description: "callback")
diff --git a/packages/pigeon/platform_tests/ios_unit_tests/ios/RunnerTests/NullableReturnsTest.m b/packages/pigeon/platform_tests/ios_unit_tests/ios/RunnerTests/NullableReturnsTest.m
index a5eef4c..3f47f70 100644
--- a/packages/pigeon/platform_tests/ios_unit_tests/ios/RunnerTests/NullableReturnsTest.m
+++ b/packages/pigeon/platform_tests/ios_unit_tests/ios/RunnerTests/NullableReturnsTest.m
@@ -33,7 +33,7 @@
 
 - (void)testNullableParameterWithFlutterApi {
   EchoBinaryMessenger *binaryMessenger =
-      [[EchoBinaryMessenger alloc] initWithCodec:NRNullableArgFlutterApiGetCodec()];
+      [[EchoBinaryMessenger alloc] initWithCodec:NRNullableArgHostApiGetCodec()];
   NRNullableArgFlutterApi *api =
       [[NRNullableArgFlutterApi alloc] initWithBinaryMessenger:binaryMessenger];
   XCTestExpectation *expectation = [self expectationWithDescription:@"callback"];
diff --git a/packages/pigeon/pubspec.yaml b/packages/pigeon/pubspec.yaml
index cb524d5..84029e2 100644
--- a/packages/pigeon/pubspec.yaml
+++ b/packages/pigeon/pubspec.yaml
@@ -2,7 +2,7 @@
 description: Code generator tool to make communication between Flutter and the host platform type-safe and easier.
 repository: https://github.com/flutter/packages/tree/main/packages/pigeon
 issue_tracker: https://github.com/flutter/flutter/issues?q=is%3Aissue+is%3Aopen+label%3Apigeon
-version: 4.2.1 # This must match the version in lib/generator_tools.dart
+version: 4.2.2 # This must match the version in lib/generator_tools.dart
 
 environment:
   sdk: ">=2.12.0 <3.0.0"
diff --git a/packages/pigeon/test/cpp_generator_test.dart b/packages/pigeon/test/cpp_generator_test.dart
index 8b36e46..cdf3876 100644
--- a/packages/pigeon/test/cpp_generator_test.dart
+++ b/packages/pigeon/test/cpp_generator_test.dart
@@ -1122,4 +1122,78 @@
       expect(code, contains('//$comment'));
     }
   });
+
+  test('doesnt create codecs if no custom datatypes', () {
+    final Root root = Root(
+      apis: <Api>[
+        Api(
+          name: 'Api',
+          location: ApiLocation.flutter,
+          methods: <Method>[
+            Method(
+              name: 'method',
+              returnType: const TypeDeclaration.voidDeclaration(),
+              arguments: <NamedType>[
+                NamedType(
+                  name: 'field',
+                  type: const TypeDeclaration(
+                    baseName: 'int',
+                    isNullable: true,
+                  ),
+                ),
+              ],
+            )
+          ],
+        )
+      ],
+      classes: <Class>[],
+      enums: <Enum>[],
+    );
+    final StringBuffer sink = StringBuffer();
+    generateCppHeader('', const CppOptions(), root, sink);
+    final String code = sink.toString();
+    expect(code, isNot(contains(' : public flutter::StandardCodecSerializer')));
+  });
+
+  test('creates custom codecs if custom datatypes present', () {
+    final Root root = Root(apis: <Api>[
+      Api(name: 'Api', location: ApiLocation.flutter, methods: <Method>[
+        Method(
+          name: 'doSomething',
+          arguments: <NamedType>[
+            NamedType(
+                type: const TypeDeclaration(
+                  baseName: 'Input',
+                  isNullable: false,
+                ),
+                name: '')
+          ],
+          returnType:
+              const TypeDeclaration(baseName: 'Output', isNullable: false),
+          isAsynchronous: true,
+        )
+      ])
+    ], classes: <Class>[
+      Class(name: 'Input', fields: <NamedType>[
+        NamedType(
+            type: const TypeDeclaration(
+              baseName: 'String',
+              isNullable: true,
+            ),
+            name: 'input')
+      ]),
+      Class(name: 'Output', fields: <NamedType>[
+        NamedType(
+            type: const TypeDeclaration(
+              baseName: 'String',
+              isNullable: true,
+            ),
+            name: 'output')
+      ])
+    ], enums: <Enum>[]);
+    final StringBuffer sink = StringBuffer();
+    generateCppHeader('', const CppOptions(), root, sink);
+    final String code = sink.toString();
+    expect(code, contains(' : public flutter::StandardCodecSerializer'));
+  });
 }
diff --git a/packages/pigeon/test/dart_generator_test.dart b/packages/pigeon/test/dart_generator_test.dart
index cf467d2..582b29e 100644
--- a/packages/pigeon/test/dart_generator_test.dart
+++ b/packages/pigeon/test/dart_generator_test.dart
@@ -1234,4 +1234,79 @@
       expect(code, contains('///$comment'));
     }
   });
+
+  test('doesnt create codecs if no custom datatypes', () {
+    final Root root = Root(
+      apis: <Api>[
+        Api(
+          name: 'Api',
+          location: ApiLocation.flutter,
+          methods: <Method>[
+            Method(
+              name: 'method',
+              returnType: const TypeDeclaration.voidDeclaration(),
+              arguments: <NamedType>[
+                NamedType(
+                  name: 'field',
+                  type: const TypeDeclaration(
+                    baseName: 'int',
+                    isNullable: true,
+                  ),
+                ),
+              ],
+            )
+          ],
+        )
+      ],
+      classes: <Class>[],
+      enums: <Enum>[],
+    );
+    final StringBuffer sink = StringBuffer();
+    generateDart(const DartOptions(), root, sink);
+    final String code = sink.toString();
+    expect(code, isNot(contains('extends StandardMessageCodec')));
+    expect(code, contains('StandardMessageCodec'));
+  });
+
+  test('creates custom codecs if custom datatypes present', () {
+    final Root root = Root(apis: <Api>[
+      Api(name: 'Api', location: ApiLocation.flutter, methods: <Method>[
+        Method(
+          name: 'doSomething',
+          arguments: <NamedType>[
+            NamedType(
+                type: const TypeDeclaration(
+                  baseName: 'Input',
+                  isNullable: false,
+                ),
+                name: '')
+          ],
+          returnType:
+              const TypeDeclaration(baseName: 'Output', isNullable: false),
+          isAsynchronous: true,
+        )
+      ])
+    ], classes: <Class>[
+      Class(name: 'Input', fields: <NamedType>[
+        NamedType(
+            type: const TypeDeclaration(
+              baseName: 'String',
+              isNullable: true,
+            ),
+            name: 'input')
+      ]),
+      Class(name: 'Output', fields: <NamedType>[
+        NamedType(
+            type: const TypeDeclaration(
+              baseName: 'String',
+              isNullable: true,
+            ),
+            name: 'output')
+      ])
+    ], enums: <Enum>[]);
+    final StringBuffer sink = StringBuffer();
+    generateDart(const DartOptions(), root, sink);
+    final String code = sink.toString();
+    expect(code, contains('extends StandardMessageCodec'));
+  });
 }
diff --git a/packages/pigeon/test/java_generator_test.dart b/packages/pigeon/test/java_generator_test.dart
index 7621eec..bbe6db8 100644
--- a/packages/pigeon/test/java_generator_test.dart
+++ b/packages/pigeon/test/java_generator_test.dart
@@ -1158,4 +1158,81 @@
           true);
     }
   });
+
+  test('doesnt create codecs if no custom datatypes', () {
+    final Root root = Root(
+      apis: <Api>[
+        Api(
+          name: 'Api',
+          location: ApiLocation.flutter,
+          methods: <Method>[
+            Method(
+              name: 'method',
+              returnType: const TypeDeclaration.voidDeclaration(),
+              arguments: <NamedType>[
+                NamedType(
+                  name: 'field',
+                  type: const TypeDeclaration(
+                    baseName: 'int',
+                    isNullable: true,
+                  ),
+                ),
+              ],
+            )
+          ],
+        )
+      ],
+      classes: <Class>[],
+      enums: <Enum>[],
+    );
+    final StringBuffer sink = StringBuffer();
+    const JavaOptions javaOptions = JavaOptions(className: 'Messages');
+    generateJava(javaOptions, root, sink);
+    final String code = sink.toString();
+    expect(code, isNot(contains(' extends StandardMessageCodec')));
+    expect(code, contains('StandardMessageCodec'));
+  });
+
+  test('creates custom codecs if custom datatypes present', () {
+    final Root root = Root(apis: <Api>[
+      Api(name: 'Api', location: ApiLocation.flutter, methods: <Method>[
+        Method(
+          name: 'doSomething',
+          arguments: <NamedType>[
+            NamedType(
+                type: const TypeDeclaration(
+                  baseName: 'Input',
+                  isNullable: false,
+                ),
+                name: '')
+          ],
+          returnType:
+              const TypeDeclaration(baseName: 'Output', isNullable: false),
+          isAsynchronous: true,
+        )
+      ])
+    ], classes: <Class>[
+      Class(name: 'Input', fields: <NamedType>[
+        NamedType(
+            type: const TypeDeclaration(
+              baseName: 'String',
+              isNullable: true,
+            ),
+            name: 'input')
+      ]),
+      Class(name: 'Output', fields: <NamedType>[
+        NamedType(
+            type: const TypeDeclaration(
+              baseName: 'String',
+              isNullable: true,
+            ),
+            name: 'output')
+      ])
+    ], enums: <Enum>[]);
+    final StringBuffer sink = StringBuffer();
+    const JavaOptions javaOptions = JavaOptions(className: 'Messages');
+    generateJava(javaOptions, root, sink);
+    final String code = sink.toString();
+    expect(code, contains(' extends StandardMessageCodec'));
+  });
 }
diff --git a/packages/pigeon/test/kotlin_generator_test.dart b/packages/pigeon/test/kotlin_generator_test.dart
index 35cd887..c9c8c6f 100644
--- a/packages/pigeon/test/kotlin_generator_test.dart
+++ b/packages/pigeon/test/kotlin_generator_test.dart
@@ -29,7 +29,7 @@
     const KotlinOptions kotlinOptions = KotlinOptions();
     generateKotlin(kotlinOptions, root, sink);
     final String code = sink.toString();
-    expect(code, contains('data class Foobar('));
+    expect(code, contains('data class Foobar ('));
     expect(code, contains('val field1: Long? = null'));
     expect(code, contains('fun fromMap(map: Map<String, Any?>): Foobar'));
     expect(code, contains('fun toMap(): Map<String, Any?>'));
@@ -194,8 +194,6 @@
 
     const KotlinOptions kotlinOptions = KotlinOptions();
     generateKotlin(kotlinOptions, root, sink);
-    const KotlinOptions swiftOptions = KotlinOptions();
-    generateKotlin(swiftOptions, root, sink);
     final String code = sink.toString();
     expect(code, contains('val aBool: Boolean? = null'));
     expect(code, contains('val aInt: Long? = null'));
@@ -246,8 +244,8 @@
       ])
     ], enums: <Enum>[]);
     final StringBuffer sink = StringBuffer();
-    const KotlinOptions swiftOptions = KotlinOptions();
-    generateKotlin(swiftOptions, root, sink);
+    const KotlinOptions kotlinOptions = KotlinOptions();
+    generateKotlin(kotlinOptions, root, sink);
     final String code = sink.toString();
     expect(code,
         contains('class Api(private val binaryMessenger: BinaryMessenger)'));
@@ -283,8 +281,8 @@
       ]),
     ], enums: <Enum>[]);
     final StringBuffer sink = StringBuffer();
-    const KotlinOptions swiftOptions = KotlinOptions();
-    generateKotlin(swiftOptions, root, sink);
+    const KotlinOptions kotlinOptions = KotlinOptions();
+    generateKotlin(kotlinOptions, root, sink);
     final String code = sink.toString();
     expect(code, isNot(matches('.*doSomething(.*) ->')));
     expect(code, matches('doSomething(.*)'));
@@ -319,8 +317,8 @@
       ]),
     ], enums: <Enum>[]);
     final StringBuffer sink = StringBuffer();
-    const KotlinOptions swiftOptions = KotlinOptions();
-    generateKotlin(swiftOptions, root, sink);
+    const KotlinOptions kotlinOptions = KotlinOptions();
+    generateKotlin(kotlinOptions, root, sink);
     final String code = sink.toString();
     expect(code, contains('callback: () -> Unit'));
     expect(code, contains('callback()'));
@@ -348,8 +346,8 @@
       ]),
     ], enums: <Enum>[]);
     final StringBuffer sink = StringBuffer();
-    const KotlinOptions swiftOptions = KotlinOptions();
-    generateKotlin(swiftOptions, root, sink);
+    const KotlinOptions kotlinOptions = KotlinOptions();
+    generateKotlin(kotlinOptions, root, sink);
     final String code = sink.toString();
     expect(code, contains('fun doSomething(): Output'));
     expect(code, contains('wrapped["result"] = api.doSomething()'));
@@ -379,8 +377,8 @@
       ]),
     ], enums: <Enum>[]);
     final StringBuffer sink = StringBuffer();
-    const KotlinOptions swiftOptions = KotlinOptions();
-    generateKotlin(swiftOptions, root, sink);
+    const KotlinOptions kotlinOptions = KotlinOptions();
+    generateKotlin(kotlinOptions, root, sink);
     final String code = sink.toString();
     expect(code, contains('fun doSomething(callback: (Output) -> Unit)'));
     expect(code, contains('channel.send(null)'));
@@ -399,8 +397,8 @@
       ]),
     ], enums: <Enum>[]);
     final StringBuffer sink = StringBuffer();
-    const KotlinOptions swiftOptions = KotlinOptions();
-    generateKotlin(swiftOptions, root, sink);
+    const KotlinOptions kotlinOptions = KotlinOptions();
+    generateKotlin(kotlinOptions, root, sink);
     final String code = sink.toString();
     expect(code, contains('data class Foobar'));
     expect(code, contains('val field1: List<Any?>? = null'));
@@ -419,8 +417,8 @@
       ]),
     ], enums: <Enum>[]);
     final StringBuffer sink = StringBuffer();
-    const KotlinOptions swiftOptions = KotlinOptions();
-    generateKotlin(swiftOptions, root, sink);
+    const KotlinOptions kotlinOptions = KotlinOptions();
+    generateKotlin(kotlinOptions, root, sink);
     final String code = sink.toString();
     expect(code, contains('data class Foobar'));
     expect(code, contains('val field1: Map<Any, Any?>? = null'));
@@ -457,8 +455,8 @@
       enums: <Enum>[],
     );
     final StringBuffer sink = StringBuffer();
-    const KotlinOptions swiftOptions = KotlinOptions();
-    generateKotlin(swiftOptions, root, sink);
+    const KotlinOptions kotlinOptions = KotlinOptions();
+    generateKotlin(kotlinOptions, root, sink);
     final String code = sink.toString();
     expect(code, contains('data class Outer'));
     expect(code, contains('data class Nested'));
@@ -512,8 +510,8 @@
       ])
     ], enums: <Enum>[]);
     final StringBuffer sink = StringBuffer();
-    const KotlinOptions swiftOptions = KotlinOptions();
-    generateKotlin(swiftOptions, root, sink);
+    const KotlinOptions kotlinOptions = KotlinOptions();
+    generateKotlin(kotlinOptions, root, sink);
     final String code = sink.toString();
     expect(code, contains('interface Api'));
     expect(code, contains('api.doSomething(argArg) {'));
@@ -560,8 +558,8 @@
       ])
     ], enums: <Enum>[]);
     final StringBuffer sink = StringBuffer();
-    const KotlinOptions swiftOptions = KotlinOptions();
-    generateKotlin(swiftOptions, root, sink);
+    const KotlinOptions kotlinOptions = KotlinOptions();
+    generateKotlin(kotlinOptions, root, sink);
     final String code = sink.toString();
     expect(code, contains('class Api'));
     expect(code, matches('fun doSomething.*Input.*callback.*Output.*Unit'));
@@ -593,8 +591,8 @@
       enums: <Enum>[anEnum],
     );
     final StringBuffer sink = StringBuffer();
-    const KotlinOptions swiftOptions = KotlinOptions();
-    generateKotlin(swiftOptions, root, sink);
+    const KotlinOptions kotlinOptions = KotlinOptions();
+    generateKotlin(kotlinOptions, root, sink);
     final String code = sink.toString();
     expect(code, contains('enum class Enum1(val raw: Int)'));
     expect(code, contains('ONE(0)'));
@@ -608,10 +606,10 @@
   test('header', () {
     final Root root = Root(apis: <Api>[], classes: <Class>[], enums: <Enum>[]);
     final StringBuffer sink = StringBuffer();
-    final KotlinOptions swiftOptions = KotlinOptions(
+    final KotlinOptions kotlinOptions = KotlinOptions(
       copyrightHeader: makeIterable('hello world'),
     );
-    generateKotlin(swiftOptions, root, sink);
+    generateKotlin(kotlinOptions, root, sink);
     final String code = sink.toString();
     expect(code, startsWith('// hello world'));
   });
@@ -637,8 +635,8 @@
       enums: <Enum>[],
     );
     final StringBuffer sink = StringBuffer();
-    const KotlinOptions swiftOptions = KotlinOptions();
-    generateKotlin(swiftOptions, root, sink);
+    const KotlinOptions kotlinOptions = KotlinOptions();
+    generateKotlin(kotlinOptions, root, sink);
     final String code = sink.toString();
     expect(code, contains('data class Foobar'));
     expect(code, contains('val field1: List<Long?>'));
@@ -666,8 +664,8 @@
       enums: <Enum>[],
     );
     final StringBuffer sink = StringBuffer();
-    const KotlinOptions swiftOptions = KotlinOptions();
-    generateKotlin(swiftOptions, root, sink);
+    const KotlinOptions kotlinOptions = KotlinOptions();
+    generateKotlin(kotlinOptions, root, sink);
     final String code = sink.toString();
     expect(code, contains('data class Foobar'));
     expect(code, contains('val field1: Map<String?, String?>'));
@@ -697,8 +695,8 @@
       enums: <Enum>[],
     );
     final StringBuffer sink = StringBuffer();
-    const KotlinOptions swiftOptions = KotlinOptions();
-    generateKotlin(swiftOptions, root, sink);
+    const KotlinOptions kotlinOptions = KotlinOptions();
+    generateKotlin(kotlinOptions, root, sink);
     final String code = sink.toString();
     expect(code, contains('fun doit(arg: List<Long?>'));
   });
@@ -727,8 +725,8 @@
       enums: <Enum>[],
     );
     final StringBuffer sink = StringBuffer();
-    const KotlinOptions swiftOptions = KotlinOptions();
-    generateKotlin(swiftOptions, root, sink);
+    const KotlinOptions kotlinOptions = KotlinOptions();
+    generateKotlin(kotlinOptions, root, sink);
     final String code = sink.toString();
     expect(code, contains('fun doit(argArg: List<Long?>'));
   });
@@ -752,8 +750,8 @@
       enums: <Enum>[],
     );
     final StringBuffer sink = StringBuffer();
-    const KotlinOptions swiftOptions = KotlinOptions();
-    generateKotlin(swiftOptions, root, sink);
+    const KotlinOptions kotlinOptions = KotlinOptions();
+    generateKotlin(kotlinOptions, root, sink);
     final String code = sink.toString();
     expect(code, contains('fun doit(): List<Long?>'));
     expect(code, contains('wrapped["result"] = api.doit()'));
@@ -779,8 +777,8 @@
       enums: <Enum>[],
     );
     final StringBuffer sink = StringBuffer();
-    const KotlinOptions swiftOptions = KotlinOptions();
-    generateKotlin(swiftOptions, root, sink);
+    const KotlinOptions kotlinOptions = KotlinOptions();
+    generateKotlin(kotlinOptions, root, sink);
     final String code = sink.toString();
     expect(code, contains('fun doit(callback: (List<Long?>) -> Unit'));
     expect(code, contains('val result = it as List<Long?>'));
@@ -807,8 +805,8 @@
       ])
     ], classes: <Class>[], enums: <Enum>[]);
     final StringBuffer sink = StringBuffer();
-    const KotlinOptions swiftOptions = KotlinOptions();
-    generateKotlin(swiftOptions, root, sink);
+    const KotlinOptions kotlinOptions = KotlinOptions();
+    generateKotlin(kotlinOptions, root, sink);
     final String code = sink.toString();
     expect(code, contains('fun add(x: Long, y: Long): Long'));
     expect(code, contains('val args = message as List<Any?>'));
@@ -844,8 +842,8 @@
       ])
     ], classes: <Class>[], enums: <Enum>[]);
     final StringBuffer sink = StringBuffer();
-    const KotlinOptions swiftOptions = KotlinOptions();
-    generateKotlin(swiftOptions, root, sink);
+    const KotlinOptions kotlinOptions = KotlinOptions();
+    generateKotlin(kotlinOptions, root, sink);
     final String code = sink.toString();
     expect(code, contains('val channel = BasicMessageChannel'));
     expect(code, contains('val result = it as Long'));
@@ -872,8 +870,8 @@
       enums: <Enum>[],
     );
     final StringBuffer sink = StringBuffer();
-    const KotlinOptions swiftOptions = KotlinOptions();
-    generateKotlin(swiftOptions, root, sink);
+    const KotlinOptions kotlinOptions = KotlinOptions();
+    generateKotlin(kotlinOptions, root, sink);
     final String code = sink.toString();
     expect(code, contains('fun doit(): Long?'));
   });
@@ -896,8 +894,8 @@
       enums: <Enum>[],
     );
     final StringBuffer sink = StringBuffer();
-    const KotlinOptions swiftOptions = KotlinOptions();
-    generateKotlin(swiftOptions, root, sink);
+    const KotlinOptions kotlinOptions = KotlinOptions();
+    generateKotlin(kotlinOptions, root, sink);
     final String code = sink.toString();
     expect(code, contains('fun doit(callback: (Long?) -> Unit'));
   });
@@ -923,8 +921,8 @@
       enums: <Enum>[],
     );
     final StringBuffer sink = StringBuffer();
-    const KotlinOptions swiftOptions = KotlinOptions();
-    generateKotlin(swiftOptions, root, sink);
+    const KotlinOptions kotlinOptions = KotlinOptions();
+    generateKotlin(kotlinOptions, root, sink);
     final String code = sink.toString();
     expect(
         code,
@@ -953,8 +951,8 @@
       enums: <Enum>[],
     );
     final StringBuffer sink = StringBuffer();
-    const KotlinOptions swiftOptions = KotlinOptions();
-    generateKotlin(swiftOptions, root, sink);
+    const KotlinOptions kotlinOptions = KotlinOptions();
+    generateKotlin(kotlinOptions, root, sink);
     final String code = sink.toString();
     expect(code, contains('fun doit(fooArg: Long?, callback: () -> Unit'));
   });
@@ -988,8 +986,8 @@
       ]),
     ], enums: <Enum>[]);
     final StringBuffer sink = StringBuffer();
-    const KotlinOptions swiftOptions = KotlinOptions();
-    generateKotlin(swiftOptions, root, sink);
+    const KotlinOptions kotlinOptions = KotlinOptions();
+    generateKotlin(kotlinOptions, root, sink);
     final String code = sink.toString();
     expect(code, contains('val input: String\n'));
   });
@@ -1070,4 +1068,81 @@
           true);
     }
   });
+
+  test('doesnt create codecs if no custom datatypes', () {
+    final Root root = Root(
+      apis: <Api>[
+        Api(
+          name: 'Api',
+          location: ApiLocation.flutter,
+          methods: <Method>[
+            Method(
+              name: 'method',
+              returnType: const TypeDeclaration.voidDeclaration(),
+              arguments: <NamedType>[
+                NamedType(
+                  name: 'field',
+                  type: const TypeDeclaration(
+                    baseName: 'int',
+                    isNullable: true,
+                  ),
+                ),
+              ],
+            )
+          ],
+        )
+      ],
+      classes: <Class>[],
+      enums: <Enum>[],
+    );
+    final StringBuffer sink = StringBuffer();
+    const KotlinOptions kotlinOptions = KotlinOptions();
+    generateKotlin(kotlinOptions, root, sink);
+    final String code = sink.toString();
+    expect(code, isNot(contains(' : StandardMessageCodec() ')));
+    expect(code, contains('StandardMessageCodec'));
+  });
+
+  test('creates custom codecs if custom datatypes present', () {
+    final Root root = Root(apis: <Api>[
+      Api(name: 'Api', location: ApiLocation.flutter, methods: <Method>[
+        Method(
+          name: 'doSomething',
+          arguments: <NamedType>[
+            NamedType(
+                type: const TypeDeclaration(
+                  baseName: 'Input',
+                  isNullable: false,
+                ),
+                name: '')
+          ],
+          returnType:
+              const TypeDeclaration(baseName: 'Output', isNullable: false),
+          isAsynchronous: true,
+        )
+      ])
+    ], classes: <Class>[
+      Class(name: 'Input', fields: <NamedType>[
+        NamedType(
+            type: const TypeDeclaration(
+              baseName: 'String',
+              isNullable: true,
+            ),
+            name: 'input')
+      ]),
+      Class(name: 'Output', fields: <NamedType>[
+        NamedType(
+            type: const TypeDeclaration(
+              baseName: 'String',
+              isNullable: true,
+            ),
+            name: 'output')
+      ])
+    ], enums: <Enum>[]);
+    final StringBuffer sink = StringBuffer();
+    const KotlinOptions kotlinOptions = KotlinOptions();
+    generateKotlin(kotlinOptions, root, sink);
+    final String code = sink.toString();
+    expect(code, contains(' : StandardMessageCodec() '));
+  });
 }
diff --git a/packages/pigeon/test/objc_generator_test.dart b/packages/pigeon/test/objc_generator_test.dart
index ff698b3..efd177c 100644
--- a/packages/pigeon/test/objc_generator_test.dart
+++ b/packages/pigeon/test/objc_generator_test.dart
@@ -1812,4 +1812,78 @@
       expect(code, contains('///$comment'));
     }
   });
+
+  test('doesnt create codecs if no custom datatypes', () {
+    final Root root = Root(
+      apis: <Api>[
+        Api(
+          name: 'Api',
+          location: ApiLocation.flutter,
+          methods: <Method>[
+            Method(
+              name: 'method',
+              returnType: const TypeDeclaration.voidDeclaration(),
+              arguments: <NamedType>[
+                NamedType(
+                  name: 'field',
+                  type: const TypeDeclaration(
+                    baseName: 'int',
+                    isNullable: true,
+                  ),
+                ),
+              ],
+            )
+          ],
+        )
+      ],
+      classes: <Class>[],
+      enums: <Enum>[],
+    );
+    final StringBuffer sink = StringBuffer();
+    generateObjcSource(const ObjcOptions(), root, sink);
+    final String code = sink.toString();
+    expect(code, isNot(contains(' : FlutterStandardReader')));
+  });
+
+  test('creates custom codecs if custom datatypes present', () {
+    final Root root = Root(apis: <Api>[
+      Api(name: 'Api', location: ApiLocation.flutter, methods: <Method>[
+        Method(
+          name: 'doSomething',
+          arguments: <NamedType>[
+            NamedType(
+                type: const TypeDeclaration(
+                  baseName: 'Input',
+                  isNullable: false,
+                ),
+                name: '')
+          ],
+          returnType:
+              const TypeDeclaration(baseName: 'Output', isNullable: false),
+          isAsynchronous: true,
+        )
+      ])
+    ], classes: <Class>[
+      Class(name: 'Input', fields: <NamedType>[
+        NamedType(
+            type: const TypeDeclaration(
+              baseName: 'String',
+              isNullable: true,
+            ),
+            name: 'input')
+      ]),
+      Class(name: 'Output', fields: <NamedType>[
+        NamedType(
+            type: const TypeDeclaration(
+              baseName: 'String',
+              isNullable: true,
+            ),
+            name: 'output')
+      ])
+    ], enums: <Enum>[]);
+    final StringBuffer sink = StringBuffer();
+    generateObjcSource(const ObjcOptions(), root, sink);
+    final String code = sink.toString();
+    expect(code, contains(' : FlutterStandardReader'));
+  });
 }
diff --git a/packages/pigeon/test/swift_generator_test.dart b/packages/pigeon/test/swift_generator_test.dart
index c40d85a..ab0af5b 100644
--- a/packages/pigeon/test/swift_generator_test.dart
+++ b/packages/pigeon/test/swift_generator_test.dart
@@ -1020,4 +1020,80 @@
       expect(code, contains('///$comment'));
     }
   });
+
+  test('doesnt create codecs if no custom datatypes', () {
+    final Root root = Root(
+      apis: <Api>[
+        Api(
+          name: 'Api',
+          location: ApiLocation.flutter,
+          methods: <Method>[
+            Method(
+              name: 'method',
+              returnType: const TypeDeclaration.voidDeclaration(),
+              arguments: <NamedType>[
+                NamedType(
+                  name: 'field',
+                  type: const TypeDeclaration(
+                    baseName: 'int',
+                    isNullable: true,
+                  ),
+                ),
+              ],
+            )
+          ],
+        )
+      ],
+      classes: <Class>[],
+      enums: <Enum>[],
+    );
+    final StringBuffer sink = StringBuffer();
+    const SwiftOptions swiftOptions = SwiftOptions();
+    generateSwift(swiftOptions, root, sink);
+    final String code = sink.toString();
+    expect(code, isNot(contains(': FlutterStandardReader ')));
+  });
+
+  test('creates custom codecs if custom datatypes present', () {
+    final Root root = Root(apis: <Api>[
+      Api(name: 'Api', location: ApiLocation.flutter, methods: <Method>[
+        Method(
+          name: 'doSomething',
+          arguments: <NamedType>[
+            NamedType(
+                type: const TypeDeclaration(
+                  baseName: 'Input',
+                  isNullable: false,
+                ),
+                name: '')
+          ],
+          returnType:
+              const TypeDeclaration(baseName: 'Output', isNullable: false),
+          isAsynchronous: true,
+        )
+      ])
+    ], classes: <Class>[
+      Class(name: 'Input', fields: <NamedType>[
+        NamedType(
+            type: const TypeDeclaration(
+              baseName: 'String',
+              isNullable: true,
+            ),
+            name: 'input')
+      ]),
+      Class(name: 'Output', fields: <NamedType>[
+        NamedType(
+            type: const TypeDeclaration(
+              baseName: 'String',
+              isNullable: true,
+            ),
+            name: 'output')
+      ])
+    ], enums: <Enum>[]);
+    final StringBuffer sink = StringBuffer();
+    const SwiftOptions swiftOptions = SwiftOptions();
+    generateSwift(swiftOptions, root, sink);
+    final String code = sink.toString();
+    expect(code, contains(': FlutterStandardReader '));
+  });
 }
