Is SegWit a blocksize increase or more efficient use of blockspace? This question gets asked frequently on reddit, and I think it would be beneficial to have a canonical answer here:

Is SegWit a blocksize increase or more efficient use of blockspace?
Yes and no. It depends on how you frame the question.


It is a block size increase, because you can fit a larger number of
useful transactions into a block.

If you want to make a useful Bitcoin transaction, it has to be signed so that nobody else can change it. If you can find a way to make the block size limit not count the signature, then you can fit more transactions into a block. Therefore, segwit is a block size increase.
It isn't a block size increase, because increasing the block size
would be a hard fork, which segwit isn't.

There's a constant within Bitcoin:

static const unsigned int MAX_BLOCK_SIZE = 1000000;


If you raise this, even by a little, it becomes possible to create a block which new clients will accept, but old ones will not. This is commonly called a hard fork.

Segwit is not a hard fork. It does not amend or remove any rules; it only adds new rules. Increasing the block size requires modifying a rule, and segwit does not modify a rule, therefore segwit is not a block size increase.
It is a block size increase, because a block requires more space to
store and send.

You have a segwit block with 800KB of transaction data, and 800KB of witness data. This is 1.6MB, which is bigger than the previous limit. Since segwit full nodes must have this data to validate a block, segwit is a block size increase.
It isn't a block size increase, because a node requires less or the same amount of space to store and send blocks if it doesn't understand segwit.

You have the same block as the previous example, but it's sent to a node that doesn't understand segwit. It only receives the 800KB of transaction data. This is all it needs to store. Since that isn't larger than 1MB, segwit is not a block size increase. However, if it does not store the witness data, it cannot meaningfully validate the block.