diff --git a/Cython/Compiler/ExprNodes.py b/Cython/Compiler/ExprNodes.py
index 367e492fecc04049a5afcea2e435bc34b36da6c2..47339f0bb2cabc00580787da9ef5325254e60277 100644
--- a/Cython/Compiler/ExprNodes.py
+++ b/Cython/Compiler/ExprNodes.py
@@ -2096,11 +2096,8 @@ class NameNode(AtomicExprNode):
                         code.put_giveref(rhs.py_result())
             if not self.type.is_memoryviewslice:
                 if not assigned:
-                    if overloaded_assignment:
-                        code.putln('%s = %s;' % (self.result(), rhs.result()))
-                    else:
-                        code.putln('%s = %s;' % (
-                            self.result(), rhs.result_as(self.ctype())))
+                    result = rhs.result() if overloaded_assignment else rhs.result_as(self.ctype())
+                    code.putln('%s = %s;' % (self.result(), result))
                 if debug_disposal_code:
                     print("NameNode.generate_assignment_code:")
                     print("...generating post-assignment code for %s" % rhs)
diff --git a/Cython/Compiler/Nodes.py b/Cython/Compiler/Nodes.py
index 2e4d93efe54f27f2b6ada5a10ba96a4ad2bf62b3..11fd2ec35a1fc5f1981b07d1d3f9d021580c189e 100644
--- a/Cython/Compiler/Nodes.py
+++ b/Cython/Compiler/Nodes.py
@@ -901,7 +901,7 @@ class CArgDeclNode(Node):
         if self.default:
             self.default.annotate(code)
 
-    def generate_assignment_code(self, code, target=None):
+    def generate_assignment_code(self, code, target=None, overloaded_assignment=False):
         default = self.default
         if default is None or default.is_literal:
             return
@@ -909,7 +909,7 @@ class CArgDeclNode(Node):
             target = self.calculate_default_value_code(code)
         default.generate_evaluation_code(code)
         default.make_owned_reference(code)
-        result = default.result_as(self.type)
+        result = default.result() if overloaded_assignment else default.result_as(self.type)
         code.putln("%s = %s;" % (target, result))
         if self.type.is_pyobject:
             code.put_giveref(default.result())
@@ -5071,7 +5071,7 @@ class SingleAssignmentNode(AssignmentNode):
     def generate_rhs_evaluation_code(self, code):
         self.rhs.generate_evaluation_code(code)
 
-    def generate_assignment_code(self, code):
+    def generate_assignment_code(self, code, overloaded_assignment=False):
         self.lhs.generate_assignment_code(
             self.rhs, code, overloaded_assignment=self.is_overloaded_assignment)
 
@@ -5158,7 +5158,7 @@ class CascadedAssignmentNode(AssignmentNode):
     def generate_rhs_evaluation_code(self, code):
         self.rhs.generate_evaluation_code(code)
 
-    def generate_assignment_code(self, code):
+    def generate_assignment_code(self, code, overloaded_assignment=False):
         # prepare all coercions
         for rhs in self.coerced_values:
             rhs.generate_evaluation_code(code)
diff --git a/Cython/Compiler/UtilNodes.py b/Cython/Compiler/UtilNodes.py
index bfcb34ee327333dea55e25961e4554a7d086f19e..e788f3b7a55757689790f13df02d09a6d76a6c5e 100644
--- a/Cython/Compiler/UtilNodes.py
+++ b/Cython/Compiler/UtilNodes.py
@@ -53,12 +53,15 @@ class TempRefNode(AtomicExprNode):
     def generate_result_code(self, code):
         pass
 
-    def generate_assignment_code(self, rhs, code):
+    def generate_assignment_code(self, rhs, code, overloaded_assignment=False):
         if self.type.is_pyobject:
             rhs.make_owned_reference(code)
             # TODO: analyse control flow to see if this is necessary
             code.put_xdecref(self.result(), self.ctype())
-        code.putln('%s = %s;' % (self.result(), rhs.result_as(self.ctype())))
+        code.putln('%s = %s;' % (
+            self.result(),
+            rhs.result() if overloaded_assignment else rhs.result_as(self.ctype()),
+        ))
         rhs.generate_post_assignment_code(code)
         rhs.free_temps(code)
 
@@ -66,7 +69,7 @@ class CleanupTempRefNode(TempRefNode):
     # THIS IS DEPRECATED, USE LetRefNode instead
     # handle   TempHandle
 
-    def generate_assignment_code(self, rhs, code):
+    def generate_assignment_code(self, rhs, code, overloaded_assignment=False):
         pass
 
     def generate_execution_code(self, code):
@@ -200,12 +203,15 @@ class ResultRefNode(AtomicExprNode):
     def generate_disposal_code(self, code):
         pass
 
-    def generate_assignment_code(self, rhs, code):
+    def generate_assignment_code(self, rhs, code, overloaded_assignment=False):
         if self.type.is_pyobject:
             rhs.make_owned_reference(code)
             if not self.lhs_of_first_assignment:
                 code.put_decref(self.result(), self.ctype())
-        code.putln('%s = %s;' % (self.result(), rhs.result_as(self.ctype())))
+        code.putln('%s = %s;' % (
+            self.result(),
+            rhs.result() if overloaded_assignment else rhs.result_as(self.ctype()),
+        ))
         rhs.generate_post_assignment_code(code)
         rhs.free_temps(code)