One difference is that when you are configuring the utility shape on your flow, only activities marked as utility ones will show up in the drop-down.
However, regarding your questions about restrictions, the activity marked as a utility one doesn't impose any direct restrictions. However, whatever restrictions there are regarding what you should and shouldn't do when in the utility shape context of a flow, those restrictions would apply to whatever activities you call from a utility shape.
1) Make an activity A of type "activity" that calls an activity B of type "utility".
2) Run it once to make sure A and B are assembled, and then either use pyExtractCode or go directly to your server, so you get the java for both activities A and B.
3) Do it a second time but this time set activity B to be of type "activity". Compare the javas for differences.
I believe the "utility" type mostly controls which activities appear in the design-time drop-down when you are setting up your utility flow shape, but doing that java comparison will show if any assembly details are different.