Cases takes a level specification as its 3rd argument, Cases[expr, patttern, levelspec]. The (documented) default for levelspec is {1}.
Therefore, the following returns {}
In[27]:= Cases[y^2, _Power]
Out[27]= {}
Cases
looks at only level 1 for an expression with head Power. It does not find any because there are none at that level.
In[29]:= FullForm[y^2]
Out[29]//FullForm= Power[y, 2]
Heads -> True will make cases try to match the head of the expression as well. However,
In[96]:= MatchQ[Power, _Power]
Out[96]= False
So you still get an empty list.
In[28]:= Cases[y^2, _Power, Heads -> True]
Out[28]= {}
As Ilian pointed out above you can get the result you want by using a level specification of {0}.
In[44]:= Cases[y^2, _Power, {0}]
Out[44]= {y^2}