Copy object from one bucket to another (or the same bucket), preserving the original headers.
Headers from destobj are sent, while only the
bucket and name of srcobj are used. For the best
performance, when changing headers during a copy, use the
copyObjectWithReplace function. For conditional copying, the
following headers set on the destination object may be used:
x-amz-copy-source-if-match, x-amz-copy-source-if-none-match,
x-amz-copy-source-if-unmodified-since, or
x-amz-copy-source-if-modified-since. See
http://docs.amazonwebservices.com/AmazonS3/2006-03-01/API/index.html?RESTObjectCOPY.html
for more details.

Add required headers for the storage class.
Use this in combination with sendObject for new objects. To
modify the storage class of existing objects, use
rewriteStorageClass. Using reduced redundancy for object storage
trades off redundancy for storage costs.

Retrieve the storage class of a local S3Object.
Does not work for objects retrieved with getObject, since the
required header values are not returned. Use
getObjectStorageClass or listObjects from S3Bucket module to
determine storage class of existing objects.

Change the storage class (and only the storage class) of an existing object.
This actually performs a copy to the same location, preserving metadata.
It is not clear to me whether ACLs are preserved when copying to the same location.
For best performance, we must not change other headers during storage class
changes.