tl/dr version: they're the same.
Longer version: From the script tool standpoint there is no difference.
if your tool has a SpatialReference parameter, the user of said script tool will get identical experience to a CoordinateSystem.
Once upon a time they were different, the UI/user experience for these 2 types were different, SpatialReference had additional parameters (XY, Z & M Domains). That is no longer the case as of the 9.2 release.
For backward compatibility we kept both types, thought they are are interchangeable and basically identical.
You can glimpse a difference by doing arcpy.AddWarning(arcpy.GetParameterAsText(i)) in your script. They have different string values. But when you turn around and pass these values into other gp tools/arcpy api, the two slightly different strings behave identically.
SpatialReference string representation
GEOGCS['GCS_WGS_1984',DATUM['D_WGS_1984',SPHEROID['WGS_1984',6378137.0,298.257223563]],PRIMEM['Greenwich',0.0],UNIT['Degree',0.0174532925199433]];-400 -400 1000000000;-100000 10000;-100000 10000;8.98315284119522E-09;0.001;0.001;IsHighPrecision
While CoordinateSystem looks like this
GEOGCS['GCS_WGS_1984',DATUM['D_WGS_1984',SPHEROID['WGS_1984',6378137.0,298.257223563]],PRIMEM['Greenwich',0.0],UNIT['Degree',0.0174532925199433]]