How to make a Morph Object follow the surface of a model
You could do it this way:


Create a bone at about the center of the eye.
Put you pupil in front of the eye surface.
Create a plane at the same position, subdivide it a bit.
Parent the plane to the eye bone With Empty Groups then in Edit mode assign the vertices group to the plane.
Give your plane a Shrinkwrap modifier. Choose the eye as the Target, but don't display this modifier in the viewport yet (deactivate the eye icon).
Give your plane a Subsurf modifier.
Give your pupil a Surface Deform modifier, choose the plane as Target, click on Bind.
Give your pupil a Subsurf modifier.
Give your pupil a Copy Location constraint with the plane as Target.
Select the plane and activate the display option (eye icon) of the Shrinkwrap modifier. The plane should stick to the eye surface and the pupil should follow.
Make the plane invisible: Properties panel > Object > Cycles Settings, deactivate the display options.
To change the eye shape, select the plane and create some shapekeys.
Now maybe give your eye bone a Damped Track constraint to make it point to a target as explained in this video: https://www.youtube.com/watch?v=OItHr4VRP7M the eyes targets will need to be children of a central bone, in front of the nose, that will be child of the head bone. If you want to give some constraints to your pupils position you should probably give this central bone a Limit Location constraint.