diff --git a/loopy/__init__.py b/loopy/__init__.py
index 1be18726e3c720265a2503962e53c98569c59e40..79ea1ee958b74266ca524b5d0f1f90de771476e4 100644
--- a/loopy/__init__.py
+++ b/loopy/__init__.py
@@ -39,7 +39,7 @@ from loopy.library.function import (
 from loopy.kernel.data import (
         auto,
         ValueArg, GlobalArg, ConstantArg, ImageArg,
-        InstructionBase, ExpressionInstruction, CInstruction,
+        InstructionBase, Assignment, ExpressionInstruction, CInstruction,
         TemporaryVariable)
 
 from loopy.kernel import LoopKernel
@@ -116,7 +116,7 @@ __all__ = [
         "ValueArg", "ScalarArg", "GlobalArg", "ArrayArg", "ConstantArg", "ImageArg",
         "TemporaryVariable",
 
-        "InstructionBase", "ExpressionInstruction", "CInstruction",
+        "InstructionBase", "Assignment", "ExpressionInstruction", "CInstruction",
 
         "default_function_mangler", "single_arg_function_mangler",
 
diff --git a/loopy/codegen/instruction.py b/loopy/codegen/instruction.py
index c20727660fc13d93f43a21458e60cac7d25132a3..fe7124fdd2a1a0054f6bf4780ac55fd80e93737f 100644
--- a/loopy/codegen/instruction.py
+++ b/loopy/codegen/instruction.py
@@ -61,9 +61,9 @@ def wrap_in_conditionals(codegen_state, domain, check_inames, required_preds, st
 
 
 def generate_instruction_code(kernel, insn, codegen_state):
-    from loopy.kernel.data import ExpressionInstruction, CInstruction
+    from loopy.kernel.data import Assignment, CInstruction
 
-    if isinstance(insn, ExpressionInstruction):
+    if isinstance(insn, Assignment):
         result = generate_expr_instruction_code(kernel, insn, codegen_state)
     elif isinstance(insn, CInstruction):
         result = generate_c_instruction_code(kernel, insn, codegen_state)
diff --git a/loopy/frontend/fortran/translator.py b/loopy/frontend/fortran/translator.py
index 8293035a9e9ae951c069136b8705673a7f4f7d93..419bb9ae424d5afeacb2ad374f295128ae91bde9 100644
--- a/loopy/frontend/fortran/translator.py
+++ b/loopy/frontend/fortran/translator.py
@@ -230,8 +230,8 @@ class F2LoopyTranslator(FTreeWalkerBase):
         else:
             insn_deps = frozenset()
 
-        from loopy.kernel.data import ExpressionInstruction
-        insn = ExpressionInstruction(
+        from loopy.kernel.data import Assignment
+        insn = Assignment(
                 lhs, rhs,
                 forced_iname_deps=frozenset(
                     scope.active_loopy_inames),
diff --git a/loopy/kernel/__init__.py b/loopy/kernel/__init__.py
index e42aa1fd790008f5e0c6bae3847978993815679b..00380c3363a25cfc0d09decbf56c1122958dea49 100644
--- a/loopy/kernel/__init__.py
+++ b/loopy/kernel/__init__.py
@@ -1015,7 +1015,7 @@ class LoopKernel(RecordWithoutPickling):
             for dep_id in sorted(insn.insn_deps):
                 print_insn(kernel.id_to_insn[dep_id])
 
-            if isinstance(insn, lp.ExpressionInstruction):
+            if isinstance(insn, lp.Assignment):
                 lhs = str(insn.assignee)
                 rhs = str(insn.expression)
                 trailing = []
diff --git a/loopy/kernel/creation.py b/loopy/kernel/creation.py
index 9a0d5905a17179c17a120d04a017519250de6f8b..45d4f68aeb1d1ed0777c6c2d2ef02c392ae7d46e 100644
--- a/loopy/kernel/creation.py
+++ b/loopy/kernel/creation.py
@@ -29,7 +29,7 @@ import numpy as np
 from loopy.tools import intern_frozenset_of_ids
 from loopy.symbolic import IdentityMapper, WalkMapper
 from loopy.kernel.data import (
-        InstructionBase, ExpressionInstruction, SubstitutionRule)
+        InstructionBase, Assignment, SubstitutionRule)
 import islpy as isl
 from islpy import dim_type
 
@@ -158,7 +158,7 @@ SUBST_RE = re.compile(
 def parse_insn(insn):
     """
     :return: a tuple ``(insn, inames_to_dup)``, where insn is a
-        :class:`ExpressionInstruction` or a :class:`SubstitutionRule`
+        :class:`Assignment` or a :class:`SubstitutionRule`
         and *inames_to_dup* is None or a list of tuples `(old, new)`.
     """
 
@@ -285,7 +285,7 @@ def parse_insn(insn):
             raise RuntimeError("left hand side of assignment '%s' must "
                     "be variable or subscript" % lhs)
 
-        return ExpressionInstruction(
+        return Assignment(
                     id=(
                         intern(insn_id)
                         if isinstance(insn_id, str)
@@ -483,7 +483,7 @@ class ArgumentGuesser:
         self.all_written_names = set()
         from loopy.symbolic import get_dependencies
         for insn in instructions:
-            if isinstance(insn, ExpressionInstruction):
+            if isinstance(insn, Assignment):
                 (assignee_var_name, _), = insn.assignees_and_indices()
                 self.all_written_names.add(assignee_var_name)
                 self.all_names.update(get_dependencies(
@@ -551,7 +551,7 @@ class ArgumentGuesser:
         temp_var_names = set(six.iterkeys(self.temporary_variables))
 
         for insn in self.instructions:
-            if isinstance(insn, ExpressionInstruction):
+            if isinstance(insn, Assignment):
                 if insn.temp_var_type is not None:
                     (assignee_var_name, _), = insn.assignees_and_indices()
                     temp_var_names.add(assignee_var_name)
@@ -728,7 +728,7 @@ def expand_cses(instructions, cse_prefix="cse_expr"):
                 shape=()))
 
         from pymbolic.primitives import Variable
-        new_insn = ExpressionInstruction(
+        new_insn = Assignment(
                 id=None,
                 assignee=Variable(new_var_name), expression=expr,
                 predicates=insn.predicates)
@@ -748,7 +748,7 @@ def expand_cses(instructions, cse_prefix="cse_expr"):
     new_temp_vars = []
 
     for insn in instructions:
-        if isinstance(insn, ExpressionInstruction):
+        if isinstance(insn, Assignment):
             new_insns.append(insn.copy(expression=cseam(insn.expression)))
         else:
             new_insns.append(insn)
@@ -767,7 +767,7 @@ def create_temporaries(knl, default_order):
     import loopy as lp
 
     for insn in knl.instructions:
-        if isinstance(insn, ExpressionInstruction) \
+        if isinstance(insn, Assignment) \
                 and insn.temp_var_type is not None:
             (assignee_name, _), = insn.assignees_and_indices()
 
@@ -893,7 +893,7 @@ def guess_arg_shape_if_requested(kernel, default_order):
 
             try:
                 for insn in kernel.instructions:
-                    if isinstance(insn, lp.ExpressionInstruction):
+                    if isinstance(insn, lp.Assignment):
                         armap(submap(insn.assignee), kernel.insn_inames(insn))
                         armap(submap(insn.expression), kernel.insn_inames(insn))
             except TypeError as e:
diff --git a/loopy/kernel/data.py b/loopy/kernel/data.py
index 9266db0e357908e00c33256ac79b781be71bd705..cf891c0862dcc3b96470da0349fed39b3222eec2 100644
--- a/loopy/kernel/data.py
+++ b/loopy/kernel/data.py
@@ -689,9 +689,9 @@ def _get_assignee_and_index(expr):
         raise RuntimeError("invalid lvalue '%s'" % expr)
 
 
-# {{{ expression instruction
+# {{{ assignment
 
-class ExpressionInstruction(InstructionBase):
+class Assignment(InstructionBase):
     """
     .. attribute:: assignee
 
@@ -822,6 +822,15 @@ class ExpressionInstruction(InstructionBase):
             else:
                 key_builder.rec(key_hash, getattr(self, field_name))
 
+
+class ExpressionInstruction(Assignment):
+    def __init__(self, *args, **kwargs):
+        from warnings import warn
+        warn("ExpressionInstruction is deprecated. Use Assignment instead",
+                DeprecationWarning, stacklevel=2)
+
+        super(ExpressionInstruction, self).__init__(*args, **kwargs)
+
 # }}}
 
 
diff --git a/loopy/kernel/tools.py b/loopy/kernel/tools.py
index 8b21fc787b63ade17396fe9240859129d4ba7e33..979392e74958e589dd67425ea413cbbe5639818f 100644
--- a/loopy/kernel/tools.py
+++ b/loopy/kernel/tools.py
@@ -414,10 +414,10 @@ def get_dot_dependency_graph(kernel, iname_cluster=True, use_insn_id=False):
     dep_graph = {}
     lines = []
 
-    from loopy.kernel.data import ExpressionInstruction, CInstruction
+    from loopy.kernel.data import Assignment, CInstruction
 
     for insn in kernel.instructions:
-        if isinstance(insn, ExpressionInstruction):
+        if isinstance(insn, Assignment):
             op = "%s <- %s" % (insn.assignee, insn.expression)
             if len(op) > 200:
                 op = op[:200] + "..."
@@ -836,7 +836,7 @@ def assign_automatic_axes(kernel, axis=0, local_size=None):
     import loopy as lp
 
     for insn in kernel.instructions:
-        if not isinstance(insn, lp.ExpressionInstruction):
+        if not isinstance(insn, lp.Assignment):
             continue
 
         auto_axis_inames = [
diff --git a/loopy/maxima.py b/loopy/maxima.py
index 957f8e04988153a5a61da6d6ba55cb3f51e562f2..060ddbc15e7242c93bfc9f874aa724dc25dc7ef0 100644
--- a/loopy/maxima.py
+++ b/loopy/maxima.py
@@ -76,12 +76,12 @@ def get_loopy_instructions_as_maxima(kernel, prefix):
 
     written_insn_ids = set()
 
-    from loopy.kernel import InstructionBase, ExpressionInstruction
+    from loopy.kernel import InstructionBase, Assignment
 
     def write_insn(insn):
         if not isinstance(insn, InstructionBase):
             insn = kernel.id_to_insn[insn]
-        if not isinstance(insn, ExpressionInstruction):
+        if not isinstance(insn, Assignment):
             raise RuntimeError("non-expression instructions not supported "
                     "in maxima export")
 
diff --git a/loopy/preprocess.py b/loopy/preprocess.py
index 58087c10899f0b6294fac6a3c13fbbf05f6c634f..839cfd28b5a8264547e7018226a11bfe2e1bfa4f 100644
--- a/loopy/preprocess.py
+++ b/loopy/preprocess.py
@@ -84,7 +84,7 @@ def _infer_var_type(kernel, var_name, type_inf_mapper, subst_expander):
     from loopy.diagnostic import DependencyTypeInferenceFailure
     for writer_insn_id in kernel.writer_map().get(var_name, []):
         writer_insn = kernel.id_to_insn[writer_insn_id]
-        if not isinstance(writer_insn, lp.ExpressionInstruction):
+        if not isinstance(writer_insn, lp.Assignment):
             continue
 
         expr = subst_expander(writer_insn.expression)
@@ -418,7 +418,7 @@ def realize_reduction(kernel, insn_id_filter=None):
             raise LoopyError("failed to determine type of accumulator for "
                     "reduction '%s'" % expr)
 
-        from loopy.kernel.data import ExpressionInstruction, TemporaryVariable
+        from loopy.kernel.data import Assignment, TemporaryVariable
 
         new_temporary_variables[target_var_name] = TemporaryVariable(
                 name=target_var_name,
@@ -437,7 +437,7 @@ def realize_reduction(kernel, insn_id_filter=None):
                 based_on="%s_%s_init" % (insn.id, "_".join(expr.inames)),
                 extra_used_ids=set(i.id for i in generated_insns))
 
-        init_insn = ExpressionInstruction(
+        init_insn = Assignment(
                 id=init_id,
                 assignee=target_var,
                 forced_iname_deps=outer_insn_inames - frozenset(expr.inames),
@@ -450,7 +450,7 @@ def realize_reduction(kernel, insn_id_filter=None):
                 based_on="%s_%s_update" % (insn.id, "_".join(expr.inames)),
                 extra_used_ids=set(i.id for i in generated_insns))
 
-        reduction_insn = ExpressionInstruction(
+        reduction_insn = Assignment(
                 id=update_id,
                 assignee=target_var,
                 expression=expr.operation(
@@ -479,7 +479,7 @@ def realize_reduction(kernel, insn_id_filter=None):
         insn = insn_queue.pop(0)
 
         if insn_id_filter is not None and insn.id != insn_id_filter \
-                or not isinstance(insn, lp.ExpressionInstruction):
+                or not isinstance(insn, lp.Assignment):
             new_insns.append(insn)
             continue
 
diff --git a/loopy/schedule.py b/loopy/schedule.py
index f276e2f1244b41429ff434cd7fa1ad5c32d7563a..79c558822c5ffae2c553373feda59a945133dd90 100644
--- a/loopy/schedule.py
+++ b/loopy/schedule.py
@@ -326,7 +326,7 @@ def dump_schedule(kernel, schedule):
     lines = []
     indent = ""
 
-    from loopy.kernel.data import ExpressionInstruction
+    from loopy.kernel.data import Assignment
     for sched_item in schedule:
         if isinstance(sched_item, EnterLoop):
             lines.append(indent + "LOOP %s" % sched_item.iname)
@@ -336,7 +336,7 @@ def dump_schedule(kernel, schedule):
             lines.append(indent + "ENDLOOP %s" % sched_item.iname)
         elif isinstance(sched_item, RunInstruction):
             insn = kernel.id_to_insn[sched_item.insn_id]
-            if isinstance(insn, ExpressionInstruction):
+            if isinstance(insn, Assignment):
                 insn_str = "[%s] %s <- %s" % (
                         insn.id, str(insn.assignee), str(insn.expression))
             else:
diff --git a/loopy/transform/arithmetic.py b/loopy/transform/arithmetic.py
index fab133bd359153839a4b494c5cf35a7962930a95..a6830092910dcc89eefcc337961c3b215831fb41 100644
--- a/loopy/transform/arithmetic.py
+++ b/loopy/transform/arithmetic.py
@@ -250,13 +250,13 @@ def collect_common_factors_on_increment(kernel, var_name, vary_by_axes=()):
 
     # {{{ find common factors
 
-    from loopy.kernel.data import ExpressionInstruction
+    from loopy.kernel.data import Assignment
 
     for insn in kernel.instructions:
         if not is_assignee(insn):
             continue
 
-        if not isinstance(insn, ExpressionInstruction):
+        if not isinstance(insn, Assignment):
             raise LoopyError("'%s' modified by non-expression instruction"
                     % var_name)
 
@@ -332,7 +332,7 @@ def collect_common_factors_on_increment(kernel, var_name, vary_by_axes=()):
     new_insns = []
 
     for insn in kernel.instructions:
-        if not isinstance(insn, ExpressionInstruction) or not is_assignee(insn):
+        if not isinstance(insn, Assignment) or not is_assignee(insn):
             new_insns.append(insn)
             continue
 
@@ -414,7 +414,7 @@ def collect_common_factors_on_increment(kernel, var_name, vary_by_axes=()):
     subm = SubstitutionMapper(find_substitution)
 
     for insn in insns:
-        if not isinstance(insn, ExpressionInstruction) or is_assignee(insn):
+        if not isinstance(insn, Assignment) or is_assignee(insn):
             new_insns.append(insn)
             continue
 
diff --git a/loopy/transform/buffer.py b/loopy/transform/buffer.py
index 2dc86c4fb7a9d2c439b03b186a401e1c6b97e717..bcfc98f609e1ce4bc66b7094e0c48a81467f0ea7 100644
--- a/loopy/transform/buffer.py
+++ b/loopy/transform/buffer.py
@@ -351,8 +351,8 @@ def buffer_array(kernel, var_name, buffer_inames, init_expression=None,
                     }))(init_expression)
 
     init_insn_id = kernel.make_unique_instruction_id(based_on="init_"+var_name)
-    from loopy.kernel.data import ExpressionInstruction
-    init_instruction = ExpressionInstruction(id=init_insn_id,
+    from loopy.kernel.data import Assignment
+    init_instruction = Assignment(id=init_insn_id,
                 assignee=buf_var_init,
                 expression=init_expression,
                 forced_iname_deps=frozenset(within_inames),
@@ -427,8 +427,8 @@ def buffer_array(kernel, var_name, buffer_inames, init_expression=None,
                     "buffer": buf_var_store,
                     }))(store_expression)
 
-    from loopy.kernel.data import ExpressionInstruction
-    store_instruction = ExpressionInstruction(
+    from loopy.kernel.data import Assignment
+    store_instruction = Assignment(
                 id=kernel.make_unique_instruction_id(based_on="store_"+var_name),
                 insn_deps=frozenset(aar.modified_insn_ids),
                 assignee=store_target,
diff --git a/loopy/transform/diff.py b/loopy/transform/diff.py
index df03e16c741d1ba421c590d88daede5a73b2045b..95411d50bb66a1f446d722423febcc015a7d974f 100644
--- a/loopy/transform/diff.py
+++ b/loopy/transform/diff.py
@@ -236,7 +236,7 @@ class DifferentiationContext(object):
 
         id_map = RuleAwareIdentityMapper(self.rule_mapping_context)
 
-        if isinstance(insn, lp.ExpressionInstruction):
+        if isinstance(insn, lp.Assignment):
             id_map(insn.expression, self.kernel, insn)
         else:
             raise RuntimeError("do not know how to deal with "
@@ -297,7 +297,7 @@ class DifferentiationContext(object):
 
         (_, lhs_ind), = orig_writer_insn.assignees_and_indices()
         new_insn_id = self.generate_instruction_id()
-        insn = lp.ExpressionInstruction(
+        insn = lp.Assignment(
                 id=new_insn_id,
                 assignee=var(new_var_name)[
                     lhs_ind + diff_iname_exprs],
diff --git a/loopy/transform/precompute.py b/loopy/transform/precompute.py
index fc10daa49ab400e64db7d48ed42ca3e17c8f58a1..98d1d422238c9e0ef5614b133d7d4d4c9782b522 100644
--- a/loopy/transform/precompute.py
+++ b/loopy/transform/precompute.py
@@ -419,7 +419,7 @@ def precompute(kernel, subst_use, sweep_inames=[], within=None,
 
         import loopy as lp
         for insn in kernel.instructions:
-            if isinstance(insn, lp.ExpressionInstruction):
+            if isinstance(insn, lp.Assignment):
                 invg(insn.assignee, kernel, insn)
                 invg(insn.expression, kernel, insn)
 
@@ -727,11 +727,11 @@ def precompute(kernel, subst_use, sweep_inames=[], within=None,
 
     # }}}
 
-    from loopy.kernel.data import ExpressionInstruction
+    from loopy.kernel.data import Assignment
     if compute_insn_id is None:
         compute_insn_id = kernel.make_unique_instruction_id(based_on=c_subst_name)
 
-    compute_insn = ExpressionInstruction(
+    compute_insn = Assignment(
             id=compute_insn_id,
             assignee=assignee,
             expression=compute_expression)
diff --git a/test/test_loopy.py b/test/test_loopy.py
index b98e9a27a4c3b990c47fd2ea9cd0f1c8a1b29852..09b218c1e8bcddcc32ae21c72ebfd17c776204ed 100644
--- a/test/test_loopy.py
+++ b/test/test_loopy.py
@@ -545,7 +545,7 @@ def test_fuzz_code_generator(ctx_factory):
                 return np.float64
 
         knl = lp.make_kernel("{ : }",
-                [lp.ExpressionInstruction("value", expr)],
+                [lp.Assignment("value", expr)],
                 [lp.GlobalArg("value", np.complex128, shape=())]
                 + [
                     lp.ValueArg(name, get_dtype(val))
@@ -1977,7 +1977,7 @@ def test_generate_c_snippet():
     from functools import partial
     l_sum = partial(lp.Reduction, "sum")
 
-    Instr = lp.ExpressionInstruction  # noqa
+    Instr = lp.Assignment  # noqa
 
     knl = lp.make_kernel(
         "{[I, k]: 0<=I<nSpace and 0<=k<nQuad}",