(note: you should also address the answer above mine)
Having given my comment about formatting, I think this particular error is because you've got one object stored as a Transform and are trying to use it as a GameObject. If `piece` is a Transform, you need to do something like `newPiece = Instantiate(piece.gameObject, ...)`. The actual `Instantiate` method takes an Object and returns an Object, so my guess is the return type is going to be identical to the first parameter, so GameObject, Transform, RigidBody, etc. I believe with any component it will still clone the whole hierarchy but will likely return the same component type.
While they can refer to one another indefinitely (transform.gameObject.transform.gameObject...) they are not directly interchangeable.