diff --git a/binding-mri/disposable-binding.h b/binding-mri/disposable-binding.h
index fa057a4..bfe6b9c 100644
--- a/binding-mri/disposable-binding.h
+++ b/binding-mri/disposable-binding.h
@@ -27,8 +27,7 @@
 
 /* 'Children' are disposables that are disposed together
  * with their parent. Currently this is only used by Viewport
- * in RGSS1.
- * FIXME: Disable this behavior when RGSS2 or 3 */
+ * in RGSS1. */
 inline void
 disposableAddChild(VALUE disp, VALUE child)
 {
@@ -72,7 +71,8 @@ RB_METHOD(disposableDispose)
 	if (d->isDisposed())
 		return Qnil;
 
-	disposableDisposeChildren(self);
+	if (rgssVer == 1)
+		disposableDisposeChildren(self);
 
 	d->dispose();
 
@@ -100,7 +100,8 @@ static void disposableBindingInit(VALUE klass)
 
 	/* Make sure we always have access to the original method, even
 	 * if it is overridden by user scripts */
-	rb_define_alias(klass, "_mkxp_dispose_alias", "dispose");
+	if (rgssVer == 1)
+		rb_define_alias(klass, "_mkxp_dispose_alias", "dispose");
 }
 
 template<class C>
diff --git a/binding-mri/viewportelement-binding.h b/binding-mri/viewportelement-binding.h
index f3c5928..7cca69c 100644
--- a/binding-mri/viewportelement-binding.h
+++ b/binding-mri/viewportelement-binding.h
@@ -75,7 +75,9 @@ viewportElementInitialize(int argc, VALUE *argv, VALUE self)
 	if (!NIL_P(viewportObj))
 	{
 		viewport = getPrivateDataCheck<Viewport>(viewportObj, ViewportType);
-		disposableAddChild(viewportObj, self);
+
+		if (rgssVer == 1)
+			disposableAddChild(viewportObj, self);
 	}
 
 	/* Construct object */
diff --git a/binding-mruby/disposable-binding.h b/binding-mruby/disposable-binding.h
index 7cf80cb..a1c2725 100644
--- a/binding-mruby/disposable-binding.h
+++ b/binding-mruby/disposable-binding.h
@@ -74,7 +74,8 @@ MRB_METHOD(disposableDispose)
 	if (d->isDisposed())
 		return mrb_nil_value();
 
-	disposableDisposeChildren(mrb, self);
+	if (rgssVer == 1)
+		disposableDisposeChildren(mrb, self);
 
 	d->dispose();
 
@@ -100,8 +101,9 @@ static void disposableBindingInit(mrb_state *mrb, RClass *klass)
 	mrb_define_method(mrb, klass, "dispose", disposableDispose<C>, MRB_ARGS_NONE());
 	mrb_define_method(mrb, klass, "disposed?", disposableIsDisposed<C>, MRB_ARGS_NONE());
 
-	mrb_alias_method(mrb, klass, getMrbData(mrb)->symbols[CS_mkxp_dispose_alias],
-	                 mrb_intern_lit(mrb, "dispose"));
+	if (rgssVer == 1)
+		mrb_alias_method(mrb, klass, getMrbData(mrb)->symbols[CS_mkxp_dispose_alias],
+		                 mrb_intern_lit(mrb, "dispose"));
 }
 
 template<class C>
diff --git a/binding-mruby/viewportelement-binding.h b/binding-mruby/viewportelement-binding.h
index 38cd3d1..ece12f4 100644
--- a/binding-mruby/viewportelement-binding.h
+++ b/binding-mruby/viewportelement-binding.h
@@ -50,7 +50,9 @@ viewportElementInitialize(mrb_state *mrb, mrb_value self)
 	if (!mrb_nil_p(viewportObj))
 	{
 		viewport = getPrivateDataCheck<Viewport>(mrb, viewportObj, ViewportType);
-		disposableAddChild(mrb, viewportObj, self);
+
+		if (rgssVer == 1)
+			disposableAddChild(mrb, viewportObj, self);
 	}
 
 	/* Construct object */