diff --git a/harness/tests/src/main/java/godot/tests/JavaTestClass.java b/harness/tests/src/main/java/godot/tests/JavaTestClass.java
index 3d8e4d5038..2b512c3ade 100644
--- a/harness/tests/src/main/java/godot/tests/JavaTestClass.java
+++ b/harness/tests/src/main/java/godot/tests/JavaTestClass.java
@@ -3,13 +3,13 @@
 import godot.Button;
 import godot.Node;
 import godot.annotation.*;
-import godot.core.Dictionary;
-import godot.core.NativeCallable;
-import godot.core.StringNameUtils;
-import godot.core.VariantArray;
+import godot.core.*;
 import godot.signals.Signal;
 import godot.signals.Signal2;
 import godot.signals.SignalProvider;
+import kotlin.Unit;
+import kotlin.jvm.functions.Function2;
+import org.jetbrains.annotations.NotNull;
 
 @RegisterClass
 public class JavaTestClass extends Node {
@@ -68,11 +68,11 @@ public String greeting() {
     @RegisterProperty
     public boolean signalEmitted = false;
 
-    @RegisterConstructor
-    public JavaTestClass() {
-        VariantArray<Integer> arr = new VariantArray<>(Integer.class);
-        Dictionary<Float, String> dict = new Dictionary<>(Float.class, String.class);
-    }
+    @RegisterProperty
+    public VariantArray<Integer> variantArray = new VariantArray<>(Integer.class);
+
+    @RegisterProperty
+    Dictionary<Float, String> dictionary = new Dictionary<>(Float.class, String.class);
 
     @RegisterFunction
     public void connectAndTriggerSignal() {
@@ -84,6 +84,17 @@ public void connectAndTriggerSignal() {
         emitSignal(StringNameUtils.asStringName("test_signal"));
     }
 
+    @NotNull
+    @Override
+    public GodotNotification _notification() {
+        return godotNotification(
+                this, (myself, notification) -> {
+                    System.out.println(notification);
+                    return null;
+                }
+        );
+    }
+
     @RegisterFunction
     public void signalCallback() {
         signalEmitted = true;
diff --git a/kt/godot-library/src/main/kotlin/godot/core/KtObject.kt b/kt/godot-library/src/main/kotlin/godot/core/KtObject.kt
index 11e05a67be..aebd72d146 100644
--- a/kt/godot-library/src/main/kotlin/godot/core/KtObject.kt
+++ b/kt/godot-library/src/main/kotlin/godot/core/KtObject.kt
@@ -8,8 +8,7 @@ import godot.util.nullObjectID
 import godot.util.nullptr
 import kotlincompile.definitions.GodotJvmBuildConfig
 
-@JvmInline
-value class GodotNotification internal constructor(val block: Any.(Int) -> Unit)
+class GodotNotification internal constructor(val block: Any.(Int) -> Unit)
 
 @Suppress("LeakingThis")
 abstract class KtObject {
@@ -92,8 +91,12 @@ abstract class KtObject {
     open fun _notification(): GodotNotification = godotNotification {}
 
     @Suppress("UNCHECKED_CAST")
+    @JvmName("kotlinNotification")
     protected fun <T : KtObject> T.godotNotification(block: T.(Int) -> Unit): GodotNotification = GodotNotification(block as Any.(Int) -> Unit)
 
+    @JvmName("godotNotification")
+    protected fun <T : KtObject> javaGodotNotification(obj: T, block: T.(Int) -> Unit) = obj.godotNotification(block)
+
     @Suppress("FunctionName")
     /**
      * Called automatically when the Object is destroyed. Note that this method is not available for RefCounted or any of its child class.