This is happening because of antialiasing. Objects' edge pixels are partially transparent because 3D geometry does not perfectly align with screen pixels, that's why you need antialiasing, because otherwise all the edges would look horribly jagged. As useful antialiasing is, sometimes it can cause issues, like in your case. That's why usually you want certain passes to be aliased. You can try to turn image filtering off in render setup system tab and render z-depth for 1 pass. That should effectively disable antialiasing.
As alternative, you could try to achieve everything in 3D. Corona since recently has gotten new DOF highlight solver, which should help you to render bokeh highlights with significantly less noise in reasonable time. You can find this option in render setup performance tab.