diff --git a/bin/loopy b/bin/loopy
index ef4be07444d742ab9059674661f60b1fb6262467..31551c16debff1f8a73153a5796af57b7494a931 100644
--- a/bin/loopy
+++ b/bin/loopy
@@ -63,7 +63,8 @@ def main():
     parser.add_argument("outfile", default="-", metavar="OUTPUT_FILE",
             help="Defaults to stdout ('-').", nargs='?')
     parser.add_argument("--lang", metavar="LANGUAGE", help="loopy|fortran")
-    parser.add_argument("--target")
+    parser.add_argument("--target", choices=("opencl", "ispc", "c", "cuda"),
+            default="opencl")
     parser.add_argument("--name")
     parser.add_argument("--transform")
     parser.add_argument("--edit-code", action="store_true")
@@ -72,9 +73,22 @@ def main():
     parser.add_argument("--print-ir", action="store_true")
     args = parser.parse_args()
 
-    if args.target is not None:
-        from warnings import warn
-        warn("--target option is deprecated and ignored")
+    if args.target == "opencl":
+        from loopy.target.opencl import OpenCLTarget
+        target = OpenCLTarget()
+    elif args.target == "ispc":
+        from loopy.target.ispc import ISPCTarget
+        target = ISPCTarget()
+    elif args.target == "c":
+        from loopy.target.c import CTarget
+        target = CTarget()
+    elif args.target == "cuda":
+        from loopy.target.cuda import CudaTarget
+        target = CudaTarget()
+    else:
+        raise ValueError("unknown target: %s" % target)
+
+    lp.set_default_target(target)
 
     lang = None
     if args.infile == "-":
diff --git a/loopy/__init__.py b/loopy/__init__.py
index 66fc351eed9f4ff84132afd787c1c5892ef56a1d..86a5ce09ce35d623dd2edbccae1a49662ab5cdd2 100644
--- a/loopy/__init__.py
+++ b/loopy/__init__.py
@@ -354,4 +354,31 @@ def make_copy_kernel(new_dim_tags, old_dim_tags=None):
 # }}}
 
 
+# {{{ default target
+
+_DEFAULT_TARGET = None
+
+
+def _set_up_default_target():
+    try:
+        import pyopencl  # noqa
+    except ImportError:
+        from loopy.target.opencl import OpenCLTarget
+        target = OpenCLTarget()
+    else:
+        from loopy.target.pyopencl import PyOpenCLTarget
+        target = PyOpenCLTarget()
+
+    set_default_target(target)
+
+
+def set_default_target(target):
+    # deliberately undocumented for now
+    global _DEFAULT_TARGET
+    _DEFAULT_TARGET = target
+
+
+# }}}
+
+
 # vim: foldmethod=marker
diff --git a/loopy/kernel/creation.py b/loopy/kernel/creation.py
index 4683ca905c32cdcade15e32c9745ec353d886375..9a0d5905a17179c17a120d04a017519250de6f8b 100644
--- a/loopy/kernel/creation.py
+++ b/loopy/kernel/creation.py
@@ -1071,7 +1071,7 @@ def make_kernel(domains, instructions, kernel_data=["..."], **kwargs):
     :arg options: an instance of :class:`loopy.Options` or an equivalent
         string representation
     :arg target: an instance of :class:`loopy.target.TargetBase`, or *None*,
-        to use an OpenCL target.
+        to use the default target. (see :func:`loopy.set_default_target`)
     """
 
     defines = kwargs.pop("defines", {})
@@ -1083,14 +1083,8 @@ def make_kernel(domains, instructions, kernel_data=["..."], **kwargs):
     target = kwargs.pop("target", None)
 
     if target is None:
-        try:
-            import pyopencl  # noqa
-        except ImportError:
-            from loopy.target.opencl import OpenCLTarget
-            target = OpenCLTarget()
-        else:
-            from loopy.target.pyopencl import PyOpenCLTarget
-            target = PyOpenCLTarget()
+        from loopy import _DEFAULT_TARGET
+        target = _DEFAULT_TARGET
 
     if flags is not None:
         if options is not None: