diff --git a/pyopencl/cffi_cl.py b/pyopencl/cffi_cl.py
index fbd2a0cc6ba3e69399210bccb7a004336e26f4ce..24a1ac5ceb4573d8dd0042696da731adc230422f 100644
--- a/pyopencl/cffi_cl.py
+++ b/pyopencl/cffi_cl.py
@@ -150,12 +150,21 @@ def _generic_info_to_python(info):
             _lib.CLASS_COMMAND_QUEUE: CommandQueue
             }[info.opaque_class]
 
+        if klass is _Program:
+            def create_inst(val):
+                from pyopencl import Program
+                return Program(_Program._create(val))
+
+        else:
+            create_inst = klass._create
+
         if type_.endswith(']'):
-            ret = list(map(klass._create, value))
+            ret = list(map(create_inst, value))
             _lib.free_pointer(info.value)
             return ret
         else:
-            return klass._create(value)
+            return create_inst(value)
+
     if type_ == 'char*':
         ret = _ffi_pystr(value)
     elif type_.startswith('char*['):
diff --git a/test/test_wrapper.py b/test/test_wrapper.py
index aef813a965699dca473744d4fd5d50544718107a..1f13b9cd9e12bd4497a33a14b956c4b86ed44c5b 100644
--- a/test/test_wrapper.py
+++ b/test/test_wrapper.py
@@ -764,6 +764,23 @@ def test_buffer_get_host_array(ctx_factory):
         pass
 
 
+def test_program_valued_get_info(ctx_factory):
+    ctx = ctx_factory()
+
+    prg = cl.Program(ctx, """
+    __kernel void
+    reverse(__global float *out)
+    {
+        out[get_global_id(0)] *= 2;
+    }
+    """).build()
+
+    knl = prg.reverse
+
+    assert knl.program == prg
+    knl.program.binaries[0]
+
+
 if __name__ == "__main__":
     # make sure that import failures get reported, instead of skipping the tests.
     import pyopencl  # noqa