diff --git a/pyopencl/array.py b/pyopencl/array.py
index 2aac16ea592734fccd5767c7e3d3830ce109ef28..9b28f17b103a6e9d896c7d80d4352b2788e76536 100644
--- a/pyopencl/array.py
+++ b/pyopencl/array.py
@@ -823,7 +823,7 @@ class Array(object):
         else:
             # add a scalar
             if other == 0:
-                return self
+                return self.copy()
             else:
                 common_dtype = _get_common_dtype(self, other, self.queue)
                 result = self._new_like_me(common_dtype)
@@ -846,7 +846,7 @@ class Array(object):
         else:
             # subtract a scalar
             if other == 0:
-                return self
+                return self.copy()
             else:
                 result = self._new_like_me(
                         _get_common_dtype(self, other, self.queue))
@@ -927,7 +927,7 @@ class Array(object):
             self._div(result, self, other)
         else:
             if other == 1:
-                return self
+                return self.copy()
             else:
                 # create a new array for the result
                 common_dtype = _get_common_dtype(self, other, self.queue)
@@ -1020,9 +1020,9 @@ class Array(object):
         return result
 
     def astype(self, dtype, queue=None):
-        """Return *self*, cast to *dtype*."""
+        """Return a copy of *self*, cast to *dtype*."""
         if dtype == self.dtype:
-            return self
+            return self.copy()
 
         result = self._new_like_me(dtype=dtype)
         self._copy(result, self, queue=queue)